【问题标题】:Cursor is crashing: Index 0 requested, with a size of 0光标崩溃:请求索引 0,大小为 0
【发布时间】:2022-02-04 04:14:46
【问题描述】:

我不知道为什么我的光标是空的。我阅读了其他 4-5 个包含相同信息的问题,但我无法解决我的问题。我忘记了什么?

使用此代码,我收到消息:“光标为空”:

    public void onClick(View arg0) {
        String txt_edit_hw = edit_hw.getText().toString(); 
        ContentValues args = new ContentValues();
        args.put("hw", txt_edit_hw);

        String test = "SELECT _id FROM tbl_homework where hw='"+ txt_edit_hw +"';";

        Cursor mCursor = db.rawQuery(test, null); 

        startManagingCursor(mCursor);
        if (mCursor.moveToFirst()){

        String hw = mCursor.getString(mCursor.getColumnIndex("hw"));


        doMessage(hw);
        db.update("tbl_homework", args, "_id=34", null);
        fillData();
        } else {
            doMessage("Cursor is empty");
        }
    }

使用此代码,我得到了 crach... android Index 0 请求,大小为 0:

    public void onClick(View arg0) {
        String txt_edit_hw = edit_hw.getText().toString(); 
        ContentValues args = new ContentValues();
        args.put("hw", txt_edit_hw);

        String test = "SELECT _id FROM tbl_homework where hw='"+ txt_edit_hw +"';";

        Cursor mCursor = db.rawQuery(test, null); 

        startManagingCursor(mCursor);
        mCursor.moveToFirst();

        String hw = mCursor.getString(mCursor.getColumnIndex("hw"));

        doMessage(hw);
        db.update("tbl_homework", args, "_id=34", null);
        fillData();
    }

同样的错误:它在字符串处崩溃(我评论过)

        public void onClick(View arg0) {
        String txt_edit_hw = edit_hw.getText().toString(); 
        txt_edit_hw.trim();
        ContentValues args = new ContentValues();
        args.put("hw", txt_edit_hw);

        String test = "SELECT _id FROM tbl_homework where hw='"+ txt_edit_hw +"';";

        Cursor mCursor = db.rawQuery(test, null); 

        startManagingCursor(mCursor);
        mCursor.moveToFirst();

        /**It crashes here**/String hwl = mCursor.getString(mCursor.getColumnIndex("_id"));

        doMessage(hwl);
        db.update("tbl_homework", args, "_id=34", null);
        fillData();
    }

02-06 12:13:49.789: I/Process(6112): Sending signal. PID: 6112 SIG: 9
02-06 12:13:55.582: D/dalvikvm(6140): GC_EXTERNAL_ALLOC freed 37K, 49% free 2785K/5379K, external 5211K/5218K, paused 23ms
02-06 12:13:58.785: D/AndroidRuntime(6140): Shutting down VM
02-06 12:13:58.785: W/dalvikvm(6140): threadid=1: thread exiting with uncaught exception (group=0x40091568)
02-06 12:13:58.796: E/AndroidRuntime(6140): FATAL EXCEPTION: main
02-06 12:13:58.796: E/AndroidRuntime(6140): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at test.marco.notenha.homework$3.onClick(homework.java:227)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.view.View.performClick(View.java:2486)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.view.View$PerformClick.run(View.java:9130)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.os.Handler.handleCallback(Handler.java:587)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.os.Looper.loop(Looper.java:130)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at android.app.ActivityThread.main(ActivityThread.java:3703)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at java.lang.reflect.Method.invokeNative(Native Method)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at java.lang.reflect.Method.invoke(Method.java:507)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
02-06 12:13:58.796: E/AndroidRuntime(6140):     at dalvik.system.NativeStart.main(Native Method)

表: 行:_id、hwdate、hw 值:“34”、“05/02/12”、“hy,xsdhagsah”

【问题讨论】:

  • 您的第一种方法很好。数据库中似乎没有与您的 where 条件相关的任何数据。因此,您需要将查询编写为 String test = "SELECT * FROM tbl_homework where hw='"+ txt_edit_hw +"';";如果您没有得到结果,请再次检查您的数据库或在 edit_hw.getText().toString() 之后使用 .trim()。 PS:不要使用 getcount() 没有任何必要这样做。
  • 我使用 txt_edit_hw.trim() 时出现同样的错误;我检查了我的数据库;)有一些条目第一个是 _id = 34。
  • 您确定您的where 子句是正确的,选择不为空吗?
  • 我觉得是对的。我不知道那里出了什么问题...

标签: android sqlite android-cursor


【解决方案1】:

它只是说您的Cursor 没有任何价值,而您仍在尝试从您的Cursor 中读取。所以,最好检查cursor.getCount();的值

Log.d("Count",String.valueOf(cursor.getCount())); 
if(cursor.getCount() > 0){
// get values from cursor here
}

【讨论】:

  • @Lalit Poptani 感谢您的回答,但我不想知道如何检查光标中的值。我想知道为什么什么都没有...添加了一些有问题的代码...同样的错误
  • 要准确了解您的问题,您应该将 Logcat 输出添加到问题以及表格字段中。
  • @LalitPoptani 表字段和 LogCat 输出已添加。谢谢
  • 在尝试我的建议时,Log.d("Count",cursor.getCount()+""); 得到了什么?如果您得到 0,则表示您的光标没有价值。
  • 尝试使用像select _id from tbl_homework where hw='string_you_have_in_database' 这样的静态选择查询,然后尝试获取。
【解决方案2】:

您选择了_id 列,但您使用了mCursor.getColumnIndex("hw")。您的选择中没有列hw,只有_idgetColumnIndex() 返回0,你会得到相应的错误。

UPD:无需使用getCount()。让我分享一些代码sn-ps。首先,假设我们只需要光标的第一个值:

Cursor cursor = //query here
if (cursor.moveToFirst()) {
    // retrieve values from the cursor
}

如果我们需要多个值:

Cursor cursor = //query here
while (cursor.moveToNext()) {
    // retrieve next set of values from the cursor
}

光标的初始位置总是-1,这就是为什么上面的代码可以工作并处理所有条目的原因。

【讨论】:

  • 谢谢,我确定这是对的。但仍然有同样的错误。我在我的问题中发布了一些代码。
猜你喜欢
  • 2013-08-02
  • 2016-02-09
  • 2012-05-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2013-01-10
  • 2014-09-07
相关资源
最近更新 更多