【问题标题】:CursorIndexOutOfBoundsException Index 0 requested, with a size of 0CursorIndexOutOfBoundsException 请求索引 0,大小为 0
【发布时间】:2012-06-30 17:23:10
【问题描述】:

我正在尝试从我的数据库的某一行中获取文本。为此,我做了这个功能

public String getTranslation(long rowId) throws SQLException {    
    String str = null;
    Cursor mCursor = db.query(
        true, TABLE_LANGUAGE_FR, new String[] {
            KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK
        }, 
        KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, null, null
    );

    if (mCursor != null) {
        mCursor.moveToFirst();
        str = mCursor.getString(mCursor.getColumnIndex(KEY_ITEM_NAME));
    }
    return str;
}

我这样称呼它:

db = new DbAdapter(this);
db.createDatabase(); 
db.openDataBase();
String str = db.getTranslation(1706);

我的桌子是这样的:

我收到此错误:

09:32:08.965    307 com.Orange  ERROR   AndroidRuntime  Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
09:32:08.965    307 com.Orange  ERROR   AndroidRuntime      at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
09:32:08.965    307 com.Orange  ERROR   AndroidRuntime      at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
09:32:08.965    307 com.Orange  ERROR   AndroidRuntime      at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
09:32:08.965    307 com.Orange  ERROR   AndroidRuntime      at com.Orange.Database.DbAdapter.getTranslation(DbAdapter.java:141)
09:32:08.965    307 com.Orange  ERROR   AndroidRuntime      at com.Orange.Authentication.onCreate(Authentication.java:32)

为什么会出现此错误?我在这里做错了什么?

提前致谢。

【问题讨论】:

    标签: android database sqlite android-cursor


    【解决方案1】:

    看起来你有一个空光标。而不是检查它是否为空尝试检查

    if(mCursor.getCount() > 0)
    {
      //do stuff
    }
    

    尝试删除 where 条件,以确保在运行 select 语句时实际获取数据。 如果您仍然一无所获,则可能是您的表名有错字,或者无法连接/创建数据库/表。

    Cursor mCursor = db.query("sys_interface_text", new String[] {
           "id_interface_text", "item_name","form_label_id", "form_rank"}, 
                   "form_label_id = 1706", null, null, null,
           null);
    

    【讨论】:

    • 我放了这个条件,我看到我的光标计数为0,但我不明白为什么。
    • 阅读可汗的答案,你的数据库。查询与developer.android.com/reference/android/database/sqlite/… 中描述的语法不匹配,从参数中删除“true”可能会解决问题
    • 我按照 Khan 的说法更改了我的查询,但仍然是同样的问题。
    • 您是否仔细检查了表和数据库名称中的拼写错误?并尝试将 "KEY_FORM_LABEL_ID + "=" + rowId" 替换为 "null"
    • 查了很多遍table和db,没有发现任何错误。我得到光标为空,我不明白为什么。
    【解决方案2】:

    尝试使用

    while(cursor.moveToNext())
    {
       if(cursor.isFirst())
       {
          //Your code goes here in your case
          return mCursor.getString(mCursor.getColumnIndex(KEY_ITEM_NAME));
       }
    }
    finaly
    {
     if(mCursor!= null)
     {
       mCursor.close();
     }
    }
    

    【讨论】:

      【解决方案3】:

      尝试更改此行

      Cursor mCursor = db.query(true, TABLE_LANGUAGE_FR, new String[] {
                 KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK}, 
                         KEY_FORM_LABEL_ID + "=" + rowId, null, null, null,
                 null, null);
      

      Cursor mCursor = db.query(TABLE_LANGUAGE_FR, new String[] {
                 KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK}, 
                         KEY_FORM_LABEL_ID + "=" + rowId, null, null, null,
                 null);
      

      并在if条件中添加这个

       return str;
      

      【讨论】:

      • 再检查一下你的列名和表名应该和数据库中的一样,没有任何拼写错误,这可能会导致问题
      • KEY_FORM_LABEL_ID 是哪种类型的列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多