2011-03-27 80 views
5

我想知道如果有人可以给我一个Android游标的简要概述。一对夫妇的具体问题:SQLiteDatabases和光标

1 - 我有一个数据库查询后返回游标的方法:只要return语句之前

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 - 如果它是一个局部变量,或者我可以将它留给垃圾收集器清理,我需要在Cursor上调用close吗?

4 - 我的数据库很小,只能用于我的应用程序 - 我可以保持打开吗?

回答

9

1)游标只是指向查询返回的数据的指针,它不包含查询中的所有数据。这是为了提高性能/效率(一次不会读取大型结果集 - >使用较少的内存)。因此,如果关闭数据库,则光标无法检索数据 - >它是空的。当你关闭一个游标时,所有相关的资源被释放 - >你不能访问与这个游标相关的数据(因为它已经被释放),但是你可以使用这个游标或其他游标进行新的查询。当你关闭一个数据库时,你不能再查询它(直到你重新打开它)。

3)总是关闭游标。否则,你会遇到问题 - 如果游标未关闭并且新查询被阻止,则GC将会投诉。

4)如果你关闭它,当你的应用程序完成,是的。

+0

谢谢Alibi。关于4 - 有没有办法检测应用程序何时结束? – barry 2011-03-27 17:13:47

+0

只要您的活动到期时关闭数据库。你可以使用onDestroy方法。 http://www.outofwhatbox.com/blog/2010/12/android-closing-those-database-objects/ – alibi 2011-03-27 17:21:28

+0

它应该是onPause() - 文档说我们不能依靠onDestroy()被调用。 – barry 2011-03-27 17:27:40