Android上的查询何时返回Null?
我似乎找不到任何关于查询、插入或任何其他返回null的SQL方法的信息。但如果发生错误,它就会发生。我只是想知道游标为null是否意味着发生了错误,还是意味着没有选择任何行(例如)?我不知道我应该如何对待它-作为一个错误或可能不时发生的事情。当一个光标没有选中任何行时,它会返回(-1),如果出现错误,光标可以为null我相信你永远不需要检查Android上的查询何时返回Null?,android,sql,cursor,Android,Sql,Cursor,我似乎找不到任何关于查询、插入或任何其他返回null的SQL方法的信息。但如果发生错误,它就会发生。我只是想知道游标为null是否意味着发生了错误,还是意味着没有选择任何行(例如)?我不知道我应该如何对待它-作为一个错误或可能不时发生的事情。当一个光标没有选中任何行时,它会返回(-1),如果出现错误,光标可以为null我相信你永远不需要检查如果(光标==null){} 首先 如果查询未返回任何行,则将收到一个空光标。光标将不会为null 检查光标是否为空的方法有很多: if(cursor.ge
如果(光标==null){}
首先如果查询未返回任何行,则将收到一个空光标。光标将不会为
null
检查光标是否为空的方法有很多:
if(cursor.getCount==0){}
if(!cursor.moveToFirst()){}
true
或false
,如果收到false
,则请求的行不存在
秒如果发生错误,则需要在try-catch块中捕获错误,否则应用程序将因未处理的异常而崩溃
另外,
insert()
、update()
和delete()
返回一个整数,而不是光标。这些方法返回受语句影响的行数,如果没有行受影响,这些方法返回0
如果我们查看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;
}
您可以很容易地看到,只有在未分配游标的局部变量的情况下,才会抛出运行时异常。这意味着这个函数不能返回null
如果使用,您可以假设从工厂获得运行时异常。查看SQLiteQuery
和SQLiteCursor
的构造函数,似乎没有引发异常。如果在query.bindallargsassstrings(SelectionArgumentException)过程中绑定不正确,则可以获得IllegalArgumentException
代码>
注意:当读取非空的光标时,稍后可以从SQLiteQuery
抛出SQLiteException
该特定的Android源代码自2012年以来从未更新过。它是稳定的,那么为什么我看到的所有示例都有类似于if(cursor!=null&&cursor.moveToFirst()){…}
的代码呢?有可能(但不符合逻辑)捕获创建错误光标的错误,而不创建备用光标。这是我所知道的唯一一次可以创建空游标的情况。但是我相信如果你要花时间捕捉异常,你应该创建一个“默认”游标(像一个空的游标)。我已经遇到过,从rawQuery返回的游标总是空的,我不知道发生了什么,数据库在那里,它不是空的,返回值总是空的,它不是空的游标,它只是空的。不知道为什么。我没有任何异常输出,除非我移动光标。@Sam:ContentResolver.query和SQLiteDatabase.query抛出异常。但是,对于异常,android.database.sqlite.SqliteWrapper.query会返回null,并且大多数自定义包装器都遵循这种约定,这在android上发生,因此check cursor==null是一种很好的做法