我无法从Cursor对象获取数据

时间:2014-06-12 06:12:57

标签: android android-sqlite sqliteopenhelper

我在SQLite数据库中遵循表结构。 enter image description here

在我的SqliteOpenHelper类中,我编写了以下方法。

public Form getAllForms(){
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor cursor = db.rawQuery("select * from "+FORM_TABLE, null);
   int count = cursor.getCount();
   String formID = cursor.getString(0);
   Form form = new Form();
   form.setId(formID);
   cursor.close();
   db.close();
   return form;
}

我确定它中有一些数据,因为我已经在调试模式下看了count,我看到了数据库中实际存在的行数。但CursorIndexOutOfBoundException出现在cursor.getString(0)。加上cursor.getInt(0)和cursor.getString(1)也不起作用。可能是什么问题?

3 个答案:

答案 0 :(得分:3)

您需要将光标移动到有效行。

有效行的索引从0到count-1。首先,光标将指向行索引-1,即恰好在第一行之前的那个。

循环遍历所有行的规范方法是

if (cursor.moveToFirst()) {
    do {
         // now access cursor columns
    } while (cursor.moveToNext());
}

答案 1 :(得分:1)

在询问值之前,您需要致电moveToFirst()才能到达第一行:

  if ((cursor!= null) && (cursor.getCount() > 0)) {
                cursor.moveToFirst();
                while (cursor.isAfterLast() == false) {
}

所以只需使用您的代码

public Form getAllForms(){
   Form form = new Form();
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor cursor = db.rawQuery("select * from "+FORM_TABLE, null);
    if ((cursor != null) && (cursor.getCount() > 0)) {
              cursor.moveToFirst();
          while (cursor.isAfterLast() == false) {
              String formID = cursor.getString(0);
              form.setId(formID);
         cursor.moveToNext();
        } 
     cursor.close();
    }
   db.close();
   return form;
}

答案 2 :(得分:1)

试试这个

       try {
        cursor.moveToFirst();

        for (int i = 0; i < cursor.getCount(); i++) {

            Form form = new Form();
                              form.setId(formID);

            cursor.moveToNext();
        }
                   } finally {
        // database.close();
        cursor.close();
        dbHelper.close();
    }