android 中的 CursorIndexOutOfBoundException 索引 0 大小 0

CursorIndexOutOfBoundException index 0 size 0 in android

我正在尝试在我的应用程序中实现一项功能,如果用户之前登录过,SOS 按钮将显示在登录屏幕中。否则,SOS按钮将不会显示。

为此,我在 SQLite 中创建了一个数据库 table,专门用于跟踪用户之前是否登录过。 每当用户登录时,将在 table.

中插入一个字符串值 LoggedIn

加载登录页面时,从数据库中获取登录状态数据table。如果数据是 LoggedIn,我将显示 SOS 按钮,否则,我将显示 SOS 按钮不可见。

我正在使用以下方法获取状态数据,但出现异常:

CursorIndexOutOfBoundException index 0 size 0

 public String getLoggedInStatus()
    {
        SQLiteDatabase db = getReadableDatabase();
        String status="";
        String query = "SELECT * FROM  LoggedInStatus";   //LoggedInStatus is my table to store login status

        Cursor  cursor = db.rawQuery(query,null);

        if (cursor != null) {
          cursor.moveToFirst();
          status = cursor.getString(0); 
          //Exception is occuring in the above line
        }

        return status;
    }

我该如何解决这个问题?如何正确读取游标中的数据?

检查计数也大于零

if(cursor!=null && cursor.getCount()>0)
{
cursor.moveToFirst();
status = cursor.getString(0); 
}

您的代码几乎正确。但是 cursor.moveToFirst(); returns truefalse 取决于 Cursor 是否能够迭代。

因此,默认情况下 android 的 Cursor 具有索引 -1 作为默认值以使其在 while 循环内工作。为确保您的 Cursor 中包含任何元素,请将您的代码包装在此 if 语句中:

if (cursor != null && cursor.moveToNext()) {
   cursor.getString(0); 
   // To get the element count you can use cursor.getCount();
}

参考:https://developer.android.com/reference/android/database/Cursor#moveToNext()

很可能 table 中没有行。
检查它有多种方法,其中之一是:

if(cursor.moveToFirst())
{
    status = cursor.getString(0); 
}

消息说您正在尝试从第一行的第一列读取(提取数据)但没有第一行,因此索引 0(第 1 行)超出范围(第 0 列将始终存在,否则查询将无效并失败并显示另一条消息(可能是语法错误))。

原因是没有行被 returned。从 rawQuery 方法(或等效的 query 便捷方法)检查​​空 Cursor 是无用的,因为 Cursor 将被 returned。但是,如果 Cursor 没有行,它将为空,因此 getCount 方法将为 return 0 。

光标的 move???? 方法(例如 moveToFirst)如果无法移动,也会 return 错误。

因此,您可以不使用 if (cursor != null) {........},而是使用 if (cursor.moveToFirst()) { ...... } 或者如果 (cursor.getCount() > 0) {......}.

因此,以下内容将解决此问题:-

public String getLoggedInStatus()
{
    SQLiteDatabase db = getReadableDatabase();
    String status="";
    String query = "SELECT * FROM  LoggedInStatus";   //LoggedInStatus is my table to store login status

    Cursor  cursor = db.rawQuery(query,null);

    if (cursor.moveToFirst) { //<<<<<<<<<< CHANGED
        cursor.moveToFirst();
        status = cursor.getString(0); 
    }
    cursor.close() //<<<<<<<<<< You should always close cursors when done with them
    return status;
}
  • 请注意,如果没有要 returned 的行,getLoggedInStatus 方法将 return 一个空字符串。