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

标签 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:请求索引 -1,大小为 0

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

最佳答案

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

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

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

或者简单地

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

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

编辑

try catch 异常,然后查看 logcat 找出罪魁祸首:

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

关于java - 如果数据库中没有值,db.query() 会使应用程序崩溃吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928513/

相关文章:

java - Google App Engine 如何跟踪 httpsession 销毁

android - ionic 4 : Hardware Back Button Reloading Application

java - 使用变量作为值插入到带有 Groovy 的 SQL 中

具有多个子查询的 MySQL 查询太慢。我怎样才能加快速度?

java - 无法将 java.lang.String 字段设置为 java.lang.String

java - 如何在标准 Mac JDK6 上使用 BGGA 闭包原型(prototype)?

java - A Switch Java 问题 : case expressions must be constant expressions

android - 删除项目并添加新项目后出现错误 : Maximum number of items supported by BottomNavigationView is 5,

android - 谷歌使用新的 Intel Atom x86 仿真器映射 SDK

sql - 为什么确定性函数在 CONNECT BY LEVEL 查询中返回意外数字?