4

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

我只是想知道 cursor 为 null 是否意味着发生了错误,或者是否意味着没有选择任何行(例如)?我不知道我应该如何对待它 - 作为一个错误或可能不时发生的事情。

4

3 回答 3

7

我不相信你需要检查if(cursor == null) {}

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

有很多方法可以检查 Cursor 是否为空:

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

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

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


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

于 2012-09-21T20:40:02.767 回答
0

如果我们查看来自https://github.com/android/platform_frameworks_base/blob/master/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java的 Android 源代码,其中大多数查询结束:

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未分配的局部变量 aRuntimeException将被抛出。这意味着这个函数永远不能返回 null。

如果使用,您可以假设RuntimeException从工厂获得一个。查看构造函数,SQLiteQuery似乎SQLiteCursor没有抛出异常。IllegalArgumentException如果您的绑定在期间不正确,您可以获得query.bindAllArgsAsStrings(selectionArgs);

请注意,在读取非空值时SQLiteException可以稍后抛出。SQLiteQueryCursor

那个特定的Android源代码自2012年以来就没有更新过。它是稳定的

于 2017-09-14T03:29:38.877 回答
-3

当游标导致未选择任何行时,它返回 (-1),如果发生错误,则游标可以为空

于 2012-09-21T20:25:04.357 回答