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);

}

}

相关推荐