【问题标题】:Android SQLite database fatal exceptionAndroid SQLite 数据库致命异常
【发布时间】:2014-07-03 16:25:21
【问题描述】:

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

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 文件

【问题讨论】:

  • 请确保您的表已创建,并在此处提及您的创建表查询。
  • 表已创建,我可以在其中插入数据。我正在使用根浏览器查看该数据库文件。

标签: java android sqlite


【解决方案1】:

你应该像这样检查cursor.moveToFirst();

if(cursor.moveToFirst()){
//data found 
}
else{
//No data
}

更新:

尝试这种方式从DB获取数据,用于SQLite.rawQuery(.....)方法

  String sql = "SELECT * FROM TABLE_NAME WHERE COLUMN_ID = ?";

  Cursor cursor=Db.rawQuery(sql, new String[] { String.valueOf(COLUMN_ID_VALUE));

   if (cursor.moveToFirst()) {
           String first_column = cursor.getString(0); 
           String second_column=cursor.getString(1); 
   }

【讨论】:

  • cursor.getCount() 返回 0 。但是如何从数据库中获取数据呢?
  • query和rawQuery有什么区别?
【解决方案2】:

您的光标似乎是空的。因此,不要检查空光标,而是尝试检查 -

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;
    }

【讨论】:

  • cursor.getCount() 返回 0 。但是如何从数据库中获取数据呢?
  • @user3693550 - 您可以在查询中放入静态 rowid。在表格中查找 rowid 并放入程序以获取非空光标。
  • @user3693550 - 这是说明原因的示例。检查您的表以了解它具有的实际值并替换程序中的121122
  • 我已经添加了我的 notes.db 文件的图片
  • @user3693550 - 已更新。
【解决方案3】:

用途:

while (mCursor.moveToNext()) {

   // YOUR CODE HERE                
}

这是迄今为止在 android 中安全地遍历游标的最佳方法,并确保您不会收到 CursorIndexOutOfBoundsException

【讨论】:

  • 尝试像这样评论这一行... //cursor.moveToFirst();并检查是否可以解决任何问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多