Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的查询何时返回Null?_Android_Sql_Cursor - Fatal编程技术网

Android上的查询何时返回Null?

Android上的查询何时返回Null?,android,sql,cursor,Android,Sql,Cursor,我似乎找不到任何关于查询、插入或任何其他返回null的SQL方法的信息。但如果发生错误,它就会发生。我只是想知道游标为null是否意味着发生了错误,还是意味着没有选择任何行(例如)?我不知道我应该如何对待它-作为一个错误或可能不时发生的事情。当一个光标没有选中任何行时,它会返回(-1),如果出现错误,光标可以为null我相信你永远不需要检查如果(光标==null){} 首先 如果查询未返回任何行,则将收到一个空光标。光标将不会为null 检查光标是否为空的方法有很多: if(cursor.ge

我似乎找不到任何关于查询、插入或任何其他返回null的SQL方法的信息。但如果发生错误,它就会发生。我只是想知道游标为null是否意味着发生了错误,还是意味着没有选择任何行(例如)?我不知道我应该如何对待它-作为一个错误或可能不时发生的事情。

当一个光标没有选中任何行时,它会返回(-1),如果出现错误,光标可以为null

我相信你永远不需要检查
如果(光标==null){}

首先
如果查询未返回任何行,则将收到一个空光标。光标将不会为
null

检查光标是否为空的方法有很多:

  • if(cursor.getCount==0){}
  • if(!cursor.moveToFirst()){}
事实上,所有游标#moveTo…()方法都返回
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是一种很好的做法