0

运行此查询以从内部 Android 数据库获取数据并分配给游标:

Cursor cursor = db.query(TABLE_NAME, 
                       new String[] { KEY_ID, KEY_NAME, KEY_SURNAME },
                       KEY_ID + "=?",  
                       new String[] { String.valueOf(name) }, null, null, null);

if (cursor != null)
    cursor.moveToFirst();

Record rec = new Record(cursor.getString(0), cursor.getString(1), cursor.getString(2));

应用程序在执行此代码时崩溃。

例外:CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0

这可能是因为 KEY_ID 中没有值,因为我在运行此方法之前没有添加任何行吗?

4

1 回答 1

1

query(),不应该杀死应用程序。但是,如果那里出现问题,它会抛出您很可能不会尝试捕获的异常,这会杀死您的应用程序。无论如何,我会检查 a) logcat 输出以获取崩溃堆栈跟踪或以下行 - 您可能只是假设总是返回数据并尝试在那里访问它导致崩溃。

您应该始终检查您的查询是否返回任何内容,例如:

Cursor cursor = mDb.query(....);
if( cursor.getCount() > 0 ) {
    cursor.moveToFirst();
    .....
}

或者干脆

Cursor cursor = mDb.query(....);
if( cursor.moveToFirst() ) {
    .....
}

因为您可以轻松获得不null包含数据的有效非游标(返回零行)。尝试从此类游标访问不存在的数据将导致抛出异常(如果未捕获异常则崩溃)。

编辑

尝试捕获异常,然后查看罪魁祸首的日志:

try {
    Cursor cursor = mDb.query(....);
    if( cursor.moveToFirst() ) {
        .....
    }
} catch ( Exception e ) {
    e.printStackTrace();
}
于 2013-04-10T14:24:21.463 回答