SQLite数据库和游标

5

我很乐意为您翻译有关IT技术的内容,这篇文章需要涉及Android Cursors,您需要进行概述并回答以下两个具体问题:

1 - 我有一个方法,在数据库查询后返回一个光标(Cursor)对象:

    public static Cursor getVehicles()
{
    SQLiteDatabase db = vehicleData.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY);

    return cursor;
}

为了做好清理工作,我在返回语句之前尝试使用db.close()。然而,这导致返回的光标不包含任何行。为什么会这样?

2 - 关闭游标和关闭数据库有什么区别?

3 - 如果光标是一个局部变量,我需要调用close吗,还是可以让垃圾收集器来清理它?

4 - 我的数据库很小,只被我的应用程序使用-我可以保持它的开放状态吗?

1个回答

9

1) 光标只是指向查询返回的数据的指针,它并不包含查询的所有数据。这是为了提高性能/效率(大型结果集不会一次性读取 -> 使用的内存更少)。因此,如果关闭数据库,则光标无法检索数据 -> 它为空。

2) 当您关闭光标时,所有关联的资源都将被释放 -> 您无法访问与此光标相关联的数据(因为它已被释放),但您可以使用此或其他光标进行新的查询。当您关闭数据库时,您将无法再查询它(直到重新打开它)。

3) 始终关闭光标。否则,您将遇到问题 - 如果未关闭光标并阻止新查询,则GC将抱怨。

4) 如果在应用程序完成时关闭它,则是的。


谢谢Alibi。关于第4点 - 有没有办法检测应用程序何时完成? - barry
当你的活动过期时,只需关闭数据库。你可以使用onDestroy方法来实现。http://www.outofwhatbox.com/blog/2010/12/android-closing-those-database-objects/ - alibi
应该是onPause() - 文档指出我们不能依赖于 onDestroy() 被调用。 - barry
是的,抱歉。onPause() 是更好的选择。 - alibi
我发现在onPause中关闭db存在问题 - 我的活动使用游标为Spinner提供数据。 游标使用Activity中的startManagingCursor()进行管理。 如果我在onPause中关闭db,当活动恢复时,游标中没有数据。 onResume()中也没有db.open()方法可用。 我尝试了db.getWriteableDatabase()但没有帮助。 - barry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接