android 的sqlite 主键与simpleCursorAdapter
转载自:http://blog.csdn.net/ghd2000/article/details/5600944
android的sqlite主键与simpleCursorAdapter
最近在在做一个小例子时,出现一个小问题,就是不能显示从数据库中查出的数据,后来在网上查了一查,才知道原来是这个问题。
在使用simpleCursorAdapter显示sqlite数据时,必须注意sqlite的主键命名。由于simpleCursorAdapter的方法只识别_id,所以,当你用到sqlite的simpleCursorAdapter时,必须把数据表的主键命名为_id。否则就会出现java.lang.IllegalArgumentException:column‘_id’doesnotexist错误。
下面是ActivityMain类供大家参考一下。
publicclassActivityMainextendsActivity{
privatestaticintcount=0;
//创建数据库对象
privateSQLiteDatabasemSqliteDatabase=null;
//数据库名
privatestaticfinalStringDATABASE_name="gege.db";
//表名
privatestaticfinalStringTABLE_name="jiao";
//表中字段
privatestaticfinalStringTABLE_id="_id";
privatestaticfinalStringTABLE_NUM="num";
privatestaticfinalStringTABLE_DATA="data";
//创建sqly语句
privatestaticfinalStringCREATE_TABLE=
"CREATETABLE"+TABLE_NAME+"("+TABLE_ID+"INTEGERPRIMARYKEY,"+
""+TABLE_NUM+"INTEGER,"+TABLE_DATA+"TEXT)";
//创建线性布局
LinearLayoutm_LinearLayout=null;
//创建ListView列表视图
ListViewm_ListView=null;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
//创建linearLayout布局对象
m_LinearLayout=newLinearLayout(this);
//设置布局LinearLayout的属性
m_LinearLayout.setOrientation(LinearLayout.VERTICAL);
m_LinearLayout.setBackgroundColor(android.graphics.Color.BLACK);
//创建ListView对象
m_ListView=newListView(this);
LinearLayout.LayoutParamsparam=newLinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//listView的背景颜色
m_ListView.setBackgroundColor(Color.BLACK);
/*添加m_listView到m_LinearLayout布局*/
m_LinearLayout.addView(m_ListView,param);
//设置显示布局
setContentView(m_LinearLayout);
//打开已经存在数据库,如果数据库不存在,则创建一个数据库
mSqliteDatabase=this.openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
//获取数据库Phone的Cursor
try{
//创建表
mSqliteDatabase.execSQL(CREATE_TABLE);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
UpdataAdapter();
}
}
@Override
publicbooleanonKeyUp(intkeyCode,KeyEventevent){
//TODOAuto-generatedmethodstub
switch(keyCode){
caseKeyEvent.KEYCODE_DPAD_LEFT:
AddData();
break;
caseKeyEvent.KEYCODE_DPAD_RIGHT:
DeleteData();
break;
caseKeyEvent.KEYCODE_1:
upData();
break;
caseKeyEvent.KEYCODE_2:
DeleteTable();
break;
caseKeyEvent.KEYCODE_3:
DeleteDataBase();
break;
}
returntrue;
}
/*
*删除数据库
*
*/
publicvoidDeleteDataBase(){
this.deleteDatabase(DATABASE_NAME);
this.finish();
}
/*
*删除一个表
*/
publicvoidDeleteTable(){
mSqliteDatabase.execSQL("droptable"+TABLE_NAME);
this.finish();
}
/*
*更新一条数据
*
*/
publicvoidupData(){
ContentValuescv=newContentValues();
cv.put(TABLE_NUM,count);
cv.put(TABLE_DATA,"修改后的数据"+count);
//更新数据
mSqliteDatabase.update(TABLE_NAME,cv,TABLE_NUM+"="+Integer.toString(count-1),null);
UpdataAdapter();
}
/*
*更新视图列表
*/
privatevoidUpdataAdapter(){
//获取数据库的Curso对象
Cursorcur=mSqliteDatabase.query(TABLE_NAME,newString[]{TABLE_ID,TABLE_NUM,TABLE_DATA},null,null,null,null,null);
//获得查询的数据的条数
count=cur.getCount();
if(cur!=null&&cur.getCount()>=0){
//LisAdapter是ListView和后台数据的桥梁
ListAdapteradapter=newSimpleCursorAdapter(this,android.R.layout.simple_list_item_2,
cur,newString[]{TABLE_NUM,TABLE_DATA},
newint[]{android.R.id.text1,android.R.id.text2});
m_ListView.setAdapter(adapter);
}
}
//向表中添加一条数据
publicvoidAddData(){
ContentValuescv=newContentValues();
cv.put(TABLE_NUM,count);
cv.put(TABLE_DATA,"测试数据库数据"+count);
//插入数据
mSqliteDatabase.insert(TABLE_NAME,null,cv);
count++;
UpdataAdapter();
}
//从表中删除指定的一条数据
publicvoidDeleteData(){
//删除数据
mSqliteDatabase.execSQL("deletefrom"+TABLE_NAME+"whereid="+Integer.toString(count));
count--;
if(count<0){
count=0;
}
UpdataAdapter();
}
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
//TODOAuto-generatedmethodstub
if(keyCode==KeyEvent.KEYCODE_BACK){
//退出并关闭
mSqliteDatabase.close();
this.finish();
returntrue;
}
returnsuper.onKeyDown(keyCode,event);
}
}