【问题标题】:SQLiteDatabases and CursorsSQLite 数据库和游标
【发布时间】:2011-03-27 15:02:36
【问题描述】:

我想知道是否有人可以简要介绍一下 Android 光标。几个具体问题:

1 - 我有一个在数据库查询后返回游标的方法:

    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;
}

为了做家务,我在 return 语句之前尝试了 db.close()。但是,这会导致返回的游标不包含任何行。这是为什么呢?

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

3 - 如果游标是局部变量,我是否需要在游标上调用 close,还是可以将其留给垃圾收集器进行清理?

4 - 我的数据库很小,仅由我的应用程序使用 - 我可以让它保持打开状态吗?

【问题讨论】:

    标签: android database sqlite database-cursor


    【解决方案1】:

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

    2) 当你关闭一个游标时,所有关联的资源都会被释放 -> 你不能访问与这个游标关联的数据(因为它已经被释放了),但是你可以使用这个游标或其他游标进行新的查询。当你关闭一个数据库时,你不能再查询它(直到你重新打开它)。

    3) 始终关闭游标。否则你会遇到问题——如果游标没有关闭并且新的查询被阻止,GC 会抱怨。

    4) 如果您在应用完成后关闭它,可以。

    【讨论】:

    • 谢谢不在场证明。关于 4 - 有没有办法检测应用程序何时完成?
    • 当您的活动到期时关闭数据库。您可以为此使用 onDestroy 方法。 outofwhatbox.com/blog/2010/12/…
    • 应该是 onPause() - 文档说我们不能依赖 onDestroy() 被调用。
    • 是的,对不起。 onPause() 是更好的选择。
    • 我发现在 onPause 中关闭数据库存在问题 - 我的活动使用游标为 Spinner 提供数据。游标使用 Activity 中的 startManagingCursor() 进行管理。如果我在 onPause 中关闭数据库,则当活动恢复时,游标中没有数据。没有我可以放入 onResume() 的 db.open() 方法。我试过 db.getWriteableDatabase() 没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2017-05-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多