我似乎找不到任何关于查询、插入或其他SQL方法返回null的信息。但是如果发生错误,它确实会返回null。
我只是想知道游标为null是否意味着发生了错误,还是可能意味着没有选择任何行(例如)?我不知道我应该如何处理它 - 是作为一个错误还是可能时不时发生的情况。
我似乎找不到任何关于查询、插入或其他SQL方法返回null的信息。但是如果发生错误,它确实会返回null。
我只是想知道游标为null是否意味着发生了错误,还是可能意味着没有选择任何行(例如)?我不知道我应该如何处理它 - 是作为一个错误还是可能时不时发生的情况。
我认为你不需要检查if(cursor == null) {}
。
首先
如果您的查询没有返回任何行,则会收到一个空游标。 游标将不会是null
。
有许多方法可以检查游标是否为空:
if(cursor.getCount == 0) {}
if(!cursor.moveToFirst()) {}
实际上,所有的Cursor#moveTo...()方法都返回true
或false
,如果您收到false
,则表示您请求的行不存在。
其次
如果发生错误,则需要在try-catch块中捕获错误,否则应用程序将因未处理的异常而崩溃。
此外,insert()
、update()
和delete()
返回一个整数,而不是游标。 如果没有受到影响的行,则这些方法返回0
。
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
。查看 SQLiteQuery
和 SQLiteCursor
的构造函数,似乎没有抛出异常。在 query.bindAllArgsAsStrings(selectionArgs);
过程中,如果绑定的参数不正确,就会抛出 IllegalArgumentException
。
请注意,在读取非空Cursor
时后面可能还会抛出 SQLiteException
异常。
该特定 Android 源代码自 2012 年以来就没有更新过。它很稳定。
当光标没有返回任何行时,它会返回(-1),如果发生错误,则光标可以为null
if (cursor != null && cursor.moveToFirst()) { ... }
这样的代码呢? - Pijusn