什么时候查询在Android上返回空?

时间:2012-09-21 20:06:07

标签: android sql cursor

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

3 个答案:

答案 0 :(得分:7)

我认为你不需要检查if(cursor == null) {}

<强>第一
如果您的查询未返回任何行,您将收到 Cursor。光标null

有很多方法可以检查Cursor是否为空:

  • if(cursor.getCount == 0) {}
  • if(!cursor.moveToFirst()) {}

实际上,所有Cursor#moveTo ...()方法都会返回truefalse,如果收到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。查看SQLiteQuerySQLiteCursor的构造函数,似乎没有异常抛出。如果IllegalArgumentException

期间的绑定不正确,您可以获得query.bindAllArgsAsStrings(selectionArgs);

注意,当读取非空SQLiteException时,SQLiteQuery可以稍后抛出Cursor

  

自2012年以来,该特定的Android源代码尚未更新。它是稳定的

答案 2 :(得分:-3)

当游标导致没有选择行时,它返回(-1),如果发生错误,则游标可以为null