Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SimpleCrsorAdapter很难使用_Android_Sqlite_Listview_Simplecursoradapter - Fatal编程技术网

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创建数据库,可能是因为我之前的问题不清楚。我添加了在