安卓系统中查询何时返回空值?

4

我似乎找不到任何关于查询、插入或其他SQL方法返回null的信息。但是如果发生错误,它确实会返回null。

我只是想知道游标为null是否意味着发生了错误,还是可能意味着没有选择任何行(例如)?我不知道我应该如何处理它 - 是作为一个错误还是可能时不时发生的情况。

3个回答

6

我认为你不需要检查if(cursor == null) {}

首先
如果您的查询没有返回任何行,则会收到一个游标。 游标将不会null

有许多方法可以检查游标是否为空:

  • if(cursor.getCount == 0) {}
  • if(!cursor.moveToFirst()) {}

实际上,所有的Cursor#moveTo...()方法都返回truefalse,如果您收到false,则表示您请求的行不存在。

其次
如果发生错误,则需要在try-catch块中捕获错误,否则应用程序将因未处理的异常而崩溃。


此外,insert()update()delete()返回一个整数,而不是游标。 如果没有受到影响的行,则这些方法返回0


那么为什么我看到的所有示例都有像 if (cursor != null && cursor.moveToFirst()) { ... } 这样的代码呢? - Pijusn
1
可能(但不合逻辑)捕获从创建错误的光标而没有创建替代光标引起的错误。这是我所知道的唯一可能导致空光标的情况。然而,我认为如果你要花时间捕获异常,你应该创建一个“默认”的光标(如一个空光标)。 - Sam
我曾经遇到过这样的情况,从rawQuery返回的光标始终为null,我不知道发生了什么事,数据库在那里,而且它也不是空的,返回值始终为null,不是一个空游标,只是null。不知道为什么。除非我移动光标,否则我没有任何异常输出。 - cdytoby
@Sam:ContentResolver.query和SQLiteDatabase.query会抛出异常。然而,android.database.sqlite.SqliteWrapper.query在出现异常时返回null,大多数自定义包装器都遵循这个约定。 - Mooing Duck
它发生在安卓上,所以检查 cursor == null 是一个好的实践。 - huluyige
一个光标对象,它位于第一条记录之前。如果基础内容提供程序返回null或崩溃,则可能返回null。 - JohnyTex

0
如果我们查看Android源代码,从https://github.com/android/platform_frameworks_base/blob/master/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java,大多数查询都会结束在那里:
public Cursor query(CursorFactory factory, String[] selectionArgs) {
    final SQLiteQuery query = new SQLiteQuery(mDatabase, mSql, mCancellationSignal);
    final Cursor cursor;
    try {
        query.bindAllArgsAsStrings(selectionArgs);

        if (factory == null) {
            cursor = new SQLiteCursor(this, mEditTable, query);
        } else {
            cursor = factory.newCursor(mDatabase, this, mEditTable, query);
        }
    } catch (RuntimeException ex) {
        query.close();
        throw ex;
    }

    mQuery = query;
    return cursor;
}

你可以很容易地看出,只有当局部变量Cursor 没有被赋值时,才会抛出 RuntimeException。这意味着此函数永远不可能返回 null。

如果使用工厂模式,理论上也可以从中获得 RuntimeException。查看 SQLiteQuerySQLiteCursor 的构造函数,似乎没有抛出异常。在 query.bindAllArgsAsStrings(selectionArgs); 过程中,如果绑定的参数不正确,就会抛出 IllegalArgumentException

请注意,在读取非空Cursor 时后面可能还会抛出 SQLiteException 异常。

该特定 Android 源代码自 2012 年以来就没有更新过。它很稳定。


-3

当光标没有返回任何行时,它会返回(-1),如果发生错误,则光标可以为null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接