我正在研究一个包含SQL表格并在ListViews中显示它们的项目,我得到“列'_id'不存在”粉碎当我试图进入包含listview的活动时,我在这里检查了其他答案并且他们都说我必须有一个名为“_id”的列,我知道,还有什么可能导致这个错误?
这是我的常量类
final static String DB_CLIENTS_ID = "_id";
final static String DB_CLIENTS_NAME = "name";
final static String DB_CLIENTS_BALANCE = "balance";
final static String DB_CLIENTS_IDNUM = "idNum";
final static String DB_CLIENTS_TYPE = "type";
这是获取光标的hendler函数:
public Cursor queryClients(){
db = dbOpenHelper.getReadableDatabase();
Cursor cursor = db.query(dbConstants.TABLE_NAME_CLIENTS,
null, null, null, null, null,
dbConstants.DB_CLIENTS_NAME+ " ASC");
return cursor;
}
这是使用光标制作列表视图的代码段:
dbhendler = new dbHendler(this);
Cursor c = dbhendler.queryClients();
startManagingCursor(c);
String[] from = new String[] {dbConstants.DB_CLIENTS_ID, dbConstants.DB_CLIENTS_NAME,dbConstants.DB_CLIENTS_BALANCE};
int[] to = new int[] {R.id.account_list_id_number, R.id.account_list_client_name, R.id.account_list_balance};
adapter = new SimpleCursorAdapter(this, R.layout.account_list_line, c, from, to);
ListView lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(adapter);
除了没有名为“_id”的列之外,还有什么问题?
编辑:
这是log cat:
01-28 10:00:31.806:E / AndroidRuntime(27937):java.lang.RuntimeException:无法启动活动ComponentInfo {com.ziv.bank_app / com.ziv.bank_app.ClientListActivity}:java.lang。 IllegalArgumentException:列'_id'不存在
编辑:
创建表格的代码:
public void onCreate(SQLiteDatabase db) {
String sql1 = ""
+ "CREATE TABLE "+ dbConstants.TABLE_NAME_CLIENTS+ " ("
+dbConstants.DB_CLIENTS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+dbConstants.DB_CLIENTS_NAME + " TEXT,"
+dbConstants.DB_CLIENTS_IDNUM + " INTEGER,"
+dbConstants.DB_CLIENTS_TYPE + " TEXT,"
+dbConstants.DB_CLIENTS_BALANCE + " REAL"
+ ")";
db.execSQL(sql1);
答案 0 :(得分:3)
当我第一次看到问题时,我在这里看到答案是有一个名为“_id”的字符串,我在我的表创建文件中更改了它,但是从未创建新文件,它将在新设备上创建/ emulator但是我仍然使用我创建的那个。
只需在表创建代码中更改其名称即可创建新的数据库文件,问题就解决了。
编辑:
同样提高版本号就可以了。
答案 1 :(得分:1)
如果我没有错,请在queryClients()
Cursor cursor = db.query(dbConstants.TABLE_NAME_CLIENTS, new String[] {"_id","name","balance","idNum","type"},
null, null, null, null, "name ASC ");
或试试这个:
Cursor mCursor = db.query(true, dbConstants.TABLE_NAME_CLIENTS,
new String[] {"_id","name","balance","idNum","type"},
null,null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
答案 2 :(得分:1)
我有类似的问题,这就是我试用的方式
你可以尝试一下:
1)首先从database
或device
emulator
emulator
:data/data/databases
device
:使用adb shell
和run-as
命令
2)创建一个具有不同名称的新database
(与之前的名称不同)。
如果问题仍然存在,请告诉我
希望它可以帮助你...