我似乎没有找到有关查询,插入或任何其他返回null的SQL方法的任何信息。但是如果发生错误就会发生。我只是想知道游标是否为空意味着发生了错误,或者它是否意味着没有选择任何行(例如)?我不知道应该如何对待它 - 作为一种错误或可能不时发生的事情。
答案 0 :(得分:7)
我认为你不需要检查if(cursor == null) {}
。
<强>第一强>
如果您的查询未返回任何行,您将收到空 Cursor。光标不为null
。
有很多方法可以检查Cursor是否为空:
if(cursor.getCount == 0) {}
if(!cursor.moveToFirst()) {}
实际上,所有Cursor#moveTo ...()方法都会返回true
或false
,如果收到false
,则表示您请求的行不存在。< / p>
<强>第二强>
如果发生错误,则需要在try-catch块中捕获错误,否则应用程序将从未处理的异常中崩溃。
同样insert()
,update()
和delete()
返回一个整数,而不是Cursor。这些方法返回受语句影响的行数,如果没有行受到影响,这些方法将返回0
。
答案 1 :(得分:0)
如果我们查看来自RFC 7396的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
的局部变量,而是会抛出RuntimeException
。意味着此函数不能返回null。
如果使用,您可以假设从工厂获得RuntimeException
。查看SQLiteQuery
和SQLiteCursor
的构造函数,似乎没有异常抛出。如果IllegalArgumentException
query.bindAllArgsAsStrings(selectionArgs);
注意,当读取非空SQLiteException
时,SQLiteQuery
可以稍后抛出Cursor
。
自2012年以来,该特定的Android源代码尚未更新。它是稳定的
答案 2 :(得分:-3)
当游标导致没有选择行时,它返回(-1),如果发生错误,则游标可以为null