【问题标题】:Accessing a database cursor and closing it访问数据库游标并关闭它
【发布时间】:2014-06-10 14:16:43
【问题描述】:

我有以下代码:

Cursor cursor = mDB.rawQuery(query, null);
                    cursor.moveToFirst();
                    do {
                        //do stuff
                    } while (cursor.moveToNext());
cursor.close();

query = "<some sql code>";
cursor = mDB.rawQuery(query, null);
  1. 我可以关闭游标,然后通过使用 .rawQuery 进行另一个查询调用再次打开它吗?
  2. 在执行 cursor.moveToFirst() 时不检查游标是否为空是否可以?据我了解,查询只能返回0个结果,这在做.moveToFirst时不会有问题吗?

【问题讨论】:

    标签: android database sqlite cursor


    【解决方案1】:

    你可以这样做,但它并没有像你想象的那样做。您没有重新打开光标。您正在设置变量以引用新查询的新游标。

    我已经看到来自 db 查询的空返回。我会保留空检查。开销很小。

    【讨论】:

    • 好的,谢谢您的回答!你碰巧知道为什么查询可能返回 null 吗?那么我应该在引用之前关闭光标,还是在最后关闭光标就足够了?
    • query()rawQuery() 从不 返回 null。只有内容提供者可能会返回 null。 (当光标为空时,moveToFirst() 返回false。)
    • @CL。我很确定我已经看到了。我在我的一些代码中对其进行了空检查,而且我几乎从不反射性地添加它们。但我当然也无法证明。
    • @GabeSechan 看看源码(SQLiteDatabase,SQLiteDirectCursorDriver);这些函数要么返回有效的Cursor 对象,要么通过异常返回。你需要一个有问题的游标工厂(你用过吗?)。
    • @CL。您假设 OEM 没有对 AOSP 进行任何更改(他们一直都在这样做),并且在过去的某个版本中它没有返回 null。我所做的假设也不足以说它不能返回 null。
    【解决方案2】:

    关于close()documentation 表示您将无法再次使用光标:

    关闭光标,释放其所有资源并使其 完全无效。与 deactivate() 不同,对 requery() 的调用不会 使光标再次有效。

    如果您在适配器中使用光标,您可以在设置新光标后关闭旧光标。 swapCursor() 返回旧的 Cursor,如果没有设置游标,则返回 null,如果您尝试交换先前设置的游标的相同实例,也返回 null。知道了这一点,你可以尝试这样的事情:

    Cursor c = adapter.swapCursor(cursor);
    
    if(c != null)
        c.close();
    

    【讨论】:

    • 谢谢你的回答,但是 cursor.requery() 和 cursor.rawQuery() 不一样,而且我引用了一个新的游标进行查询,还是我错了?跨度>
    猜你喜欢
    • 2017-01-14
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多