如果数据库中没有值,db.query()是否会使应用程序崩溃?

时间:2013-04-10 14:20:54

标签: java android sql database

运行此查询以从内部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中没有值,因为我在运行此方法之前没有添加任何行吗?

1 个答案:

答案 0 :(得分:1)

没有。 query()不应该杀死该应用。但是如果出现问题那么它就会抛出你很可能没有抓到的异常,这会杀死你的应用程序。我总是检查a)logcat输出的崩溃堆栈跟踪或后续行 - 你可能只是假设总是返回数据并尝试访问它导致崩溃。

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

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

或只是

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

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

修改

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

try {
    Cursor cursor = mDb.query(....);
    if( cursor.moveToFirst() ) {
        .....
    }
} catch ( Exception e ) {
    e.printStackTrace();
}