android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0

android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0,android,database,android-sqlite,Android,Database,Android Sqlite,我在撞车报告中发现了这个错误,但无法理解它的含义。我想这是因为如果我的游标为空,我要返回-1。这会导致坠机。但我不确定为什么我的游标为空?DB类中的这个方法在我的一个活动的onResume中被调用。在onCreate中调用它会更好吗(这样它只调用一次) 这个代码会更好吗 public int getLastId() throws SQLException{ String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_LEVEL

我在撞车报告中发现了这个错误,但无法理解它的含义。我想这是因为如果我的游标为空,我要返回-1。这会导致坠机。但我不确定为什么我的游标为空?DB类中的这个方法在我的一个活动的onResume中被调用。在onCreate中调用它会更好吗(这样它只调用一次)

这个代码会更好吗

public int getLastId() throws SQLException{
        String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_LEVEL, KEY_MONEY, KEY_DAYSLEFT, KEY_VOTES, KEY_CORRUPTION};
        Cursor c = ourDatabase.query(DATABASE_TABLE, columns,null , null, null, null, null);

        if(c != null){
            c.moveToLast();
            int id = c.getInt(0);
            return id;
        }
        return 0;
    }

这可能是由
moveToLast()
调用引发的,您得到它是因为
游标没有行,可能是因为您的表是空的。

似乎您有一个空游标。因此,还要检查光标计数。改变

  if(c != null){
            c.moveToLast();
            int id = c.getInt(0);
            return id;
        }


感谢Commonware,但是桌子不是空的,因为这种情况并非总是发生,只是有时会发生。上面编辑的代码会更好吗?@user3812501:“但是表不是空的”--因为您没有检查返回行的计数,我看不出您是如何知道表不是空的。好的一点,我猜它不是空的,是因为此调用大部分时间都有效(该数据库中只有一个表,是在调用之前创建的)我将尝试一下。我是否仍将默认值保留为return-1?@user3812501如果表为空,则取决于您想要什么。
  if(c != null){
            c.moveToLast();
            int id = c.getInt(0);
            return id;
        }
 if(c != null && c.getCount() > 0){
            c.moveToLast();
            int id = c.getInt(0);
            return id;
        }