5544992 发表于 2016-11-30 09:34:27

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’ does not exist 错误。



下面是ActivityMain类 供大家参考 一下。

public class ActivityMain extends Activity {

private static int count =0;
//创建数据库对象
private SQLiteDatabase mSqliteDatabase=null;
//数据库名
private static final String DATABASE_NAME="gege.db";
//表名
private static final String TABLE_NAME="jiao";
//表中字段
private static final String TABLE_ID="_id";
private static final String TABLE_NUM="num";
private static final String TABLE_DATA="data";

//创建sqly语句
private static final String CREATE_TABLE=
"CREATE TABLE"+TABLE_NAME+"("+TABLE_ID+"INTEGER PRIMARY KEY," +
""+TABLE_NUM+" INTEGER,"+TABLE_DATA+"TEXT)";

//创建线性布局
LinearLayout m_LinearLayout =null;
//创建ListView列表视图
ListView m_ListView =null;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      //setContentView(R.layout.main);
      //创建linearLayout布局对象
      m_LinearLayout=new LinearLayout(this);
      //设置布局LinearLayout的属性
      m_LinearLayout.setOrientation(LinearLayout.VERTICAL);
      m_LinearLayout.setBackgroundColor(android.graphics.Color.BLACK);
      
      //创建ListView对象
      m_ListView = new ListView(this);
      
      LinearLayout.LayoutParams param = new LinearLayout.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 (Exception e) {
   // TODO Auto-generated catch block
   UpdataAdapter();
    }
       }


@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_LEFT:
   AddData();
   break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
   DeleteData();
   break;
case KeyEvent.KEYCODE_1:
   upData();
   break;
case KeyEvent.KEYCODE_2:
   DeleteTable();
   break;
case KeyEvent.KEYCODE_3:
   DeleteDataBase();
   break;
}

return true;
}
   
    /*
   * 删除数据库
   *
   */
   
public void DeleteDataBase(){
this.deleteDatabase(DATABASE_NAME);
this.finish();
}

/*
* 删除一个表
*/
   
public void DeleteTable(){
mSqliteDatabase.execSQL("drop table"+TABLE_NAME);
this.finish();
}
/*
* 更新一条数据
*
*/
public void upData(){
ContentValues cv = new ContentValues();
cv.put(TABLE_NUM, count);
cv.put(TABLE_DATA, "修改后的数据"+count);

//更新数据
mSqliteDatabase.update(TABLE_NAME, cv, TABLE_NUM+"="+Integer.toString(count-1), null);

UpdataAdapter();

}

/*
* 更新视图列表
*/
private void UpdataAdapter() {

//获取数据库的Curso对象
Cursor cur =mSqliteDatabase.query(TABLE_NAME, new String[]{TABLE_ID,TABLE_NUM,TABLE_DATA},null, null, null, null, null);
//获得查询的数据的条数
count = cur.getCount();
if(cur !=null && cur.getCount()>=0){
   //LisAdapter 是ListView和后台数据的桥梁
ListAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2,
             cur,new String[]{TABLE_NUM,TABLE_DATA},
             new int[]{android.R.id.text1,android.R.id.text2});
   m_ListView.setAdapter(adapter);

}

}


//向表中添加一条数据
public void AddData(){
ContentValues cv = new ContentValues();
cv.put(TABLE_NUM, count);
cv.put(TABLE_DATA, "测试数据库数据"+count);
//插入数据
mSqliteDatabase.insert(TABLE_NAME, null, cv);
count++;
UpdataAdapter();
}

//从表中删除指定的一条数据
public void DeleteData(){
//删除数据
mSqliteDatabase.execSQL("delete from"+TABLE_NAME+"where id="+Integer.toString(count));
count--;
if(count<0){
   count=0;
}
UpdataAdapter();
}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK){
   //退出并关闭
   mSqliteDatabase.close();
   this.finish();
   return true;
}
return super.onKeyDown(keyCode, event);
}
}
页: [1]
查看完整版本: android 的sqlite 主键与simpleCursorAdapter