Android SQLite数据库致命异常

时间:2014-07-03 06:47:18

标签: java android sqlite

当我调用getNode()方法时,程序抛出异常

public Cursor getNote(long rowId) throws SQLException {
        Cursor cursor = Db.query(TABLE_NAME, new String[] { COLUMN_ID,
                COLUMN_TITLE, COLUMN_BODY }, COLUMN_ID + "=" + rowId, null,
                null, null, null, null);
        if(cursor !=null){
            cursor.moveToFirst();
        }
        return cursor;
    }

这是例外。这不是完全例外。

07-03 06:46:02.161: E/AndroidRuntime(2556): FATAL EXCEPTION: main
07-03 06:46:02.161: E/AndroidRuntime(2556): Process: com.vahe_muradyan.notes, PID: 2556
07-03 06:46:02.161: E/AndroidRuntime(2556): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vahe_muradyan.notes/com.vahe_muradyan.notes.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

这是notes.db文件

enter image description here enter image description here enter image description here

3 个答案:

答案 0 :(得分:2)

您应该像{<1}}一样检查

cursor.moveToFirst();

更新

尝试以这种方式从[{1}}获取if(cursor.moveToFirst()){ //data found } else{ //No data } 方法DB

的数据
.rawQuery(.....)

答案 1 :(得分:1)

您的光标似乎是空的。所以不要检查空游标尝试检查 -

if(cursor.getCount() > 0)
{
  //do stuff
}
else
{
  //Empty cursor
}

然后检查控件的去向 - 进入if conditionelse condition

<强>更新

由于cursor.getCount()返回0,因此光标中没有数据。

要获取数据,您可以执行以下操作 -

Cursor cursor = Db.query(TABLE_NAME, new String[] { COLUMN_ID,
                COLUMN_TITLE, COLUMN_BODY }, COLUMN_ID + "= 2", null,
                null, null, null, null);

注意:

rowid = 2是表TABLE_NAME中的行ID。您可以查看此表格,看看此表格的rowid是什么,并将其替换为2

问题是因为您的动态rowid与您的任何表rowid都不匹配。

插图 -


| _ID      |   TITLE     |   NOTES    |
--------------------------------------------------
| 1        |   jsush     |   -----    |
--------------------------------------------------
| 2        |   jsushshai |   -----    |
--------------------------------------------------

查看表格,很明显,您只有两个rowid12。 因此,如果您的查询与其rowid中的任何值都不匹配,则光标将为空。

您在方法getNote(long rowId)中传递了rowid值,该方法与任何表rowid都不匹配。

类似的情况在这里你可以寻求更多的帮助 -

cursorindexoutofboundsexception-index-0-requested-with-a-size-of-0

<强>更新

试试这个 -

public Cursor getNote(long rowId) throws SQLException {
        Cursor cursor = Db.query("notes", new String[] { "_ID",
                "TITLE", "NOTES"}, "_ID=1", null,
                null, null, null, null);

      cursor.moveToFirst();

      if(cursor.getCount() > 0)
      {
        //do stuff
      }
      else
      {
        //Empty cursor
      }

        return cursor;
    }

答案 2 :(得分:0)

使用:

while (mCursor.moveToNext()) {

   // YOUR CODE HERE                
}

这是到目前为止安全迭代android中游标的最佳方法,并确保你不会得到CursorIndexOutOfBoundsException