Android SimpleCrsorAdapter很难使用
长期以来,我一直被困在某一点上,即使用Android SimpleCrsorAdapter很难使用,android,sqlite,listview,simplecursoradapter,Android,Sqlite,Listview,Simplecursoradapter,长期以来,我一直被困在某一点上,即使用 SimpleCursorAdapter 因为它返回正确的值时失败。我也看到过很多类似的帖子,说我应该在游标数据库查询中添加_id列,而不是我应该这样做 db.rawQuery(String,String) onCreate(..)中的代码是 之前我的数据库访问代码如下 public Cursor getAllRows_Patient_Db() { return db.query(DATABASE_PATI
SimpleCursorAdapter
因为它返回正确的值时失败。我也看到过很多类似的帖子,说我应该在游标数据库查询中添加_id列,而不是我应该这样做
db.rawQuery(String,String)
onCreate(..)中的代码是
之前我的数据库访问代码如下
public Cursor getAllRows_Patient_Db()
{
return db.query(DATABASE_PATIENT_TABLE, new String[] {KEY_ROWID, KEY_ROOM_NUMBER,
KEY_PATIENT_INITIAL
},
null,
null,
null,
null,
null);
}
public static final String KEY_ROWID = "_id";
public Cursor getAllRows_Patient_Db()
{
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
return db.rawQuery(db_sel,null);
}
其中,KEY_ROWID的定义如下
public Cursor getAllRows_Patient_Db()
{
return db.query(DATABASE_PATIENT_TABLE, new String[] {KEY_ROWID, KEY_ROOM_NUMBER,
KEY_PATIENT_INITIAL
},
null,
null,
null,
null,
null);
}
public static final String KEY_ROWID = "_id";
public Cursor getAllRows_Patient_Db()
{
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
return db.rawQuery(db_sel,null);
}
这个错误是
07-04 22:10:23.301: ERROR/AndroidRuntime(16795): Caused by: java.lang.IllegalArgumentException: column '90' does not exist
07-04 22:10:23.301: ERROR/AndroidRuntime(16795): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
07-04 22:10:23.301: ERROR/AndroidRuntime(16795): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
这里第90列不是列id,但根据我的数据库,它是存储在cursor.getString(1)中的数据,但我认为它在这里试图搜索cursor.getString(0),它是行id
后来我改变了我的代码如下
public Cursor getAllRows_Patient_Db()
{
return db.query(DATABASE_PATIENT_TABLE, new String[] {KEY_ROWID, KEY_ROOM_NUMBER,
KEY_PATIENT_INITIAL
},
null,
null,
null,
null,
null);
}
public static final String KEY_ROWID = "_id";
public Cursor getAllRows_Patient_Db()
{
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
return db.rawQuery(db_sel,null);
}
但我还是有错误,这次的错误是不同的
07-04 21:36:12.510: ERROR/global(9861): Deprecated Thread methods are not supported.
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): FATAL EXCEPTION: main
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pro/com.pro.CopyOfFirstScreen}: android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: , while compiling: SELECT id as _id, KEY_ROOM_NUMBER,KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): Caused by: android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: , while compiling: SELECT id as _id, KEY_ROOM_NUMBER,KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE
我很长一段时间都被它缠住了,请帮帮我
编辑:好的,现在有你们的帮助,我的查询语句是正确的,谢谢你们。很抱歉,我不太了解数据库查询的语法,但我正在努力学习
更改后的工作查询为
String db_sel = "SELECT _id as _id, room_number" +",patient_initial FROM " + DATABASE_PATIENT_TABLE;
实际上,我必须用键值更改声明的字符串
public static final String KEY_ROWID = "_id";
public static final String KEY_ROOM_NUMBER = "room_number";
public static final String KEY_PATIENT_INITIAL = "patient_initial";
但现在我看到的另一个问题不是来自查询语句,而是我访问或使用simplecursorAdapter的方式
正如您所看到的,我的表有2行3列,现在我想从第2列和第3列获取数据,并将其放在我的listview中。
但是在查询修复之后,我得到了另一个错误
原来是
String[] columns = new String[] {c.getString(1), c.getString(2) };
int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
setListAdapter(adapter);
错误是
07-05 21:32:29.228: ERROR/AndroidRuntime(1505): Caused by: java.lang.IllegalArgumentException: column '90' does not exist
07-05 21:32:29.228: ERROR/AndroidRuntime(1505): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
07-05 21:32:29.228: ERROR/AndroidRuntime(1505): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
正如您所看到的,它正在尝试访问第一列的数据,而不是访问行
之后,我对代码进行了更改
int x = 0;
String[] columns = new String[] { c.getString(0),c.getString(1), c.getString(2) };
int[] to = new int[] { x, R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
setListAdapter(adapter);
这只是一个猜测,为了找出SimpleCursorAdapter与普通光标的工作方式有多不同,我得到的错误是
07-05 21:34:47.947: ERROR/AndroidRuntime(1966): Caused by: java.lang.IllegalArgumentException: column '1' does not exist
07-05 21:34:47.947: ERROR/AndroidRuntime(1966): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
我知道这个问题变得太长了:-(您是否建议我从这里删除一些代码。您是否阅读了错误堆栈的这部分:
android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE:
??
数据库中并没有这样的表,这不是游标适配器的问题。
您的循环似乎完全没有意义——只需阅读一些java手册即可。
好的,让我们开始列出代码中的一些问题:
String[] columns = new String[] { c.getString(1), c.getString(2) };
列[]
应包含列名称而不是值。。。
在while{}
循环中,您正在创建几十个(?)simplecursoradapter,而只传递最后一个on。
本部分代码:
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
显然是错的,我想你有
private static String DATABASE_PATIENT_TABLE = "patient";
所以只需使用这些常量:
String db_sel = "select id as _id, +"KEY_ROOM_NUMBER+", "+ KEY_PATIENT_INITIAL +" from "+DATABASE_PATIENT_TABLE;
替换为:
String[] columns = new String[] { c.getString(0),c.getString(1), c.getString(2) };
int[] to = new int[] { x, R.id.room_number_db, R.id.pt_initial_db };
因此:
String[] columns = new String[] { c.getColumnName(1), c.getColumnName(2) };
int[] to = new int[] {R.id.room_number_db, R.id.pt_initial_db };
您是否阅读了错误堆栈的这一部分:
android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE:
??
数据库中并没有这样的表,这不是游标适配器的问题。
您的循环似乎完全没有意义——只需阅读一些java手册即可。
好的,让我们开始列出代码中的一些问题:
String[] columns = new String[] { c.getString(1), c.getString(2) };
列[]
应包含列名称而不是值。。。
在while{}
循环中,您正在创建几十个(?)simplecursoradapter,而只传递最后一个on。
本部分代码:
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
显然是错的,我想你有
private static String DATABASE_PATIENT_TABLE = "patient";
所以只需使用这些常量:
String db_sel = "select id as _id, +"KEY_ROOM_NUMBER+", "+ KEY_PATIENT_INITIAL +" from "+DATABASE_PATIENT_TABLE;
替换为:
String[] columns = new String[] { c.getString(0),c.getString(1), c.getString(2) };
int[] to = new int[] { x, R.id.room_number_db, R.id.pt_initial_db };
因此:
String[] columns = new String[] { c.getColumnName(1), c.getColumnName(2) };
int[] to = new int[] {R.id.room_number_db, R.id.pt_initial_db };
新错误表示您的数据库中没有“DATABASE\u PATIENT\u table”表。从代码中,该表似乎是字符串的静态字段名,该字符串包含数据库中的表名,而不是数据库中的表名 在下面的代码中,您需要将“数据库\患者\表格”更改为数据库中表格的名称
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
试试这个,看看它是否有效:
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM" + DATABASE_PATIENT_TABLE;
至于您的原始错误,SimpleCursorAdapter必须包含_id字段。您对驱动游标的SQL语句所做的更改应该会修复它,但您需要确保SQL语句中的表名正确
希望这能有所帮助。新的错误是,您的数据库中没有表“DATABASE\u PATIENT\u table”。从您的代码中,它似乎是字符串的静态字段名,该字符串包含数据库中的表名,而不是数据库中的表名 在下面的代码中,您需要将“数据库\患者\表格”更改为数据库中表格的名称
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
试试这个,看看它是否有效:
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM" + DATABASE_PATIENT_TABLE;
至于您的原始错误,SimpleCursorAdapter必须包含_id字段。您对驱动游标的SQL语句所做的更改应该会修复它,但您需要确保SQL语句中的表名正确
希望这有帮助。问题已经解决,主要是我应该确保每次查询数据库时都要查询_id,但是如果我使用cursor.getString(someIndex)进行查询,那么这会被误导,因为在我的例子中,适配器将第一列的内容作为rowid,并尝试搜索行 不要再做rawQuery(),或者使用“Select _idas _id”之类的东西了。我觉得这些东西有时会产生误导 所以下面的代码就是保持简单。 数据库代码
public Cursor getAllRows_Patient_Db()
{
return db.query(DATABASE_PATIENT_TABLE, new String[] {
KEY_ROWID,
KEY_ROOM_NUMBER,
KEY_PATIENT_INITIAL
},
null,
null,
null,
null,
null);
}
活动代码
HospitalData = new Database(this);
HospitalData.open();
Cursor c = HospitalData.getAllRows_Patient_Db();
startManagingCursor(c);
String[] columns = new String[] {HospitalData.KEY_ROOM_NUMBER,HospitalData.KEY_PATIENT_INITIAL };
int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
setListAdapter(adapter);
问题已经解决,主要是我应该确保每次查询数据库时都要查询_id,但是如果使用cursor.getString(someIndex)进行查询,那么这会被误导,因为在我的例子中,适配器将第一列的内容作为rowid,并尝试搜索行 不要再做rawQuery(),或者使用“Select _idas _id”之类的东西了。我觉得这些东西有时会产生误导 所以下面的代码就是保持简单。 数据库代码
public Cursor getAllRows_Patient_Db()
{
return db.query(DATABASE_PATIENT_TABLE, new String[] {
KEY_ROWID,
KEY_ROOM_NUMBER,
KEY_PATIENT_INITIAL
},
null,
null,
null,
null,
null);
}
活动代码
HospitalData = new Database(this);
HospitalData.open();
Cursor c = HospitalData.getAllRows_Patient_Db();
startManagingCursor(c);
String[] columns = new String[] {HospitalData.KEY_ROOM_NUMBER,HospitalData.KEY_PATIENT_INITIAL };
int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
setListAdapter(adapter);
如果Android找不到数据库文件,通常会出现此错误。您不使用规范化DatabaseHelper有什么原因吗?我使用DatabaseHelper创建数据库,可能是因为我之前的问题不清楚。我添加了在