日期:2014-05-16  浏览次数:20427 次

android 学习日记1 数据库

过程中出现了一个问题,关于这一部分,必须注意sqlite的主键命名,由于simpleCursorAdapter的方法只识别_id,所以,当你用到sqlite的simpleCursorAdapter时,必须把数据表的主键命名为_id。否则就会出现

java.lang.IllegalArgumentException: column '_id' does not exist

错误。必须要有这个?_id才能用SimpleCursorAdapter

?

而假如我们的数据表列名中并未定义名为“?_id?”的列名,如:我的数据表中定义了三列,列名分别为:“?_id1?,??name1??,??bir?”,这样,表中就没有名为“?_id?”的数据库,(?ps?:如果你的数据表中刚好就把某一列定义成了?_id?,那么肯定是不会出现这种错误了)?[9]

查找原因:

仔细查看?Android?的开发文档中有关?SimpleCursorAdapter()?的说明发现,?SimpleCursorAdapter()?的父类是CursorAdapter()??CursorAdapter()?有一个很隐蔽的规定?

?

The Cursor must include a column named "_id" or this class will not work.?也就是说,我们查询结果集游标Cursor?返回的数据中,一定要有一列名为“?_id?”,否则这个类将不起作用,这也就是为什么?Eclipse?会报上面的错误。

解决方案:

????这种情况无需修改数据库。为满足?CursorAdapter()?类的要求,我们可以在查询语句相关代码中作如下修改:(?ps??chi?数据表三列名为:?_id1,name1,bir?

原代码:

???????public Cursor getAll(){

??????????????return db.rawQuery("SELECT * FROM chi", null);

???????}

修改后代码:

???????public Cursor getAll(){

??????????????return db.rawQuery("SELECT _id1 AS _id ,name1 , bir FROM chi", null);

??????????????//return db.rawQuery("SELECT * FROM chi", null);

???????}

?

?

package com.db;

?

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

?

/**

?* Created by IntelliJ IDEA.

?* User: titus

?* Date: 11-10-27

?* Time: 上午9:42

?*/

public class MyDBHelp