【问题标题】:Fetching a single row from a db based on id results in error根据 id 从数据库中获取单行会导致错误
【发布时间】:2016-03-16 09:31:53
【问题描述】:

我希望从一个 sqlite 数据库中获取一行。

我使用以下代码来获取值。

public ShipmentStatusDao getShipmentStatusRow(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_SHIPMENTSTATUS, new String[]{KEY_NOTES,
                        KEY_PHOTOS, KEY_DOCUMENTS}, KEY_ID + "=?",
                new String[]{String.valueOf(id)}, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();

        ShipmentStatusDao notification = new ShipmentStatusDao(cursor.getInt(0),
                cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8));

        return notification;
    }

我使用下面的代码来调用上面的方法,

 ShipmentStatusDao shipmentStatusRow = db.getShipmentStatusRow(1);
 shipmentStatusRow.getDate();

我收到以下错误,

java.lang.IllegalStateException: 无法读取第 0 行第 3 列 光标窗口。确保光标在之前正确初始化 从中访问数据。 在 android.database.CursorWindow.nativeGetString(Native Method) 在 android.database.CursorWindow.getString(CursorWindow.java:438) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 在 com.vaighai.handlers.NotificationDbHandler.getShipmentStatusRow(NotificationDbHandler.java:364) 在 com.vaighai.fragments.StatusFragment$5.onItemClick(StatusFragment.java:237) 在 android.widget.AdapterView.performItemClick(AdapterView.java:301) 在 android.widget.AbsListView.performItemClick(AbsListView.java:1510) 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:3339) 在 android.os.Handler.handleCallback(Handler.java:730) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:176) 在 android.app.ActivityThread.main(ActivityThread.java:5419) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 在 dalvik.system.NativeStart.main(本机方法)03-16 14:54:32.826 2337-7411/? I/ActivityManager:通知 ApplicationCrash

我怎样才能纠正上述错误?

【问题讨论】:

  • if (cursor != null){//your code } 这样的改变会帮助你

标签: java android sqlite


【解决方案1】:

您只查询三个字段(KEY_NOTES, KEY_PHOTOS、KEY_DOCUMENTS)。所以 cursor.getString(3) 会报错。

【讨论】:

    【解决方案2】:

    您只检查您的Cursor 是否为空,但您不检查它是否为空

    moveToFirst() 返回一个boolean,所以你知道它是否为空。你可以改变这个

    if (cursor != null)
            cursor.moveToFirst();
    
    ShipmentStatusDao notification = new ShipmentStatusDao(cursor.getInt(0),
                cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8));
    
    return notification;
    

    进入这个

    if (cursor != null && cursor.moveToFirst()) {
        ShipmentStatusDao notification = new ShipmentStatusDao(cursor.getInt(0),
                cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8));
    
        cursor.close(); // Don't forget to close BTW
        return notification;
    }  else {
        // Cursor is null or empty, you need to do something with this
        return null;
    }
    

    更新
    此外,通过在查询中提供 new String[]{KEY_NOTES, KEY_PHOTOS, KEY_DOCUMENTS},您的选择中只有三列。如果您将其更改为 null,则 Cursor 包含所有列。这应该可以解决您的错误

    【讨论】:

    • 我试过了,但再次抛出同样的错误
    • 那是因为您正在选择列。更新了我的答案
    • 可以,但它会打印出类似 com.model.ShipmentStatusDao@429cdda0
    【解决方案3】:

    所有与游标相关的代码/查询都应包含在一个代码块中。

    Cursor cursor = db.query(TABLE_SHIPMENTSTATUS, new String[]{KEY_NOTES,
                            KEY_PHOTOS, KEY_DOCUMENTS}, KEY_ID + "=?",
                    new String[]{String.valueOf(id)}, null, null, null, null);
    if (cursor != null) { 
        while (cursor.moveToNext()) {
        ... // simply do this 
        }
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2019-12-03
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多