我似乎没有找到关于查询、插入或任何其他返回 null 的 SQL 方法的任何信息。但如果发生错误,它会发生。
我只是想知道 cursor 为 null 是否意味着发生了错误,或者是否意味着没有选择任何行(例如)?我不知道我应该如何对待它 - 作为一个错误或可能不时发生的事情。
我似乎没有找到关于查询、插入或任何其他返回 null 的 SQL 方法的任何信息。但如果发生错误,它会发生。
我只是想知道 cursor 为 null 是否意味着发生了错误,或者是否意味着没有选择任何行(例如)?我不知道我应该如何对待它 - 作为一个错误或可能不时发生的事情。
我不相信你需要检查if(cursor == null) {}
。
首先
,如果您的查询没有返回任何行,您将收到一个空游标。光标不会null
。_
有很多方法可以检查 Cursor 是否为空:
if(cursor.getCount == 0) {}
if(!cursor.moveToFirst()) {}
事实上,所有 Cursor#moveTo...() 方法都返回true
or false
,如果您收到,false
则您请求的行不存在。
其次
,如果发生错误,则需要在 try-catch 块中捕获错误,否则应用程序将因未处理的异常而崩溃。
insert()
, update()
, 和返回一个整数,而delete()
不是游标。这些方法返回受您的语句影响的行数,如果没有行受到影响,这些方法返回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
可以稍后抛出。SQLiteQuery
Cursor
那个特定的Android源代码自2012年以来就没有更新过。它是稳定的
当游标导致未选择任何行时,它返回 (-1),如果发生错误,则游标可以为空