关于Android中SQLite数据库游标的几个问题

Ric*_*ral 6 database sqlite android cursor android-loadermanager

为了在我的应用程序中实现数据库访问,我遵循了Lars Vogel教程,但我对一些事情感到很困惑......

1)每次调用fetchTodo新游标时都会创建并返回.将前一个光标留给垃圾收集器.所以,如果我不使用startManagingCursor甚至CursorLoader就此而言,.close()当我完成它时,我应该在光标上调用吗?fetchTodo当然,在范围之外,例如:

Cursor cursor = mNotesAdapter.fetchTodo();
// do something...
cursor.close();
Run Code Online (Sandbox Code Playgroud)

我已经完成了这个游标,并且将在下一次获取时创建新游标,如果我这样关闭它还是应该将它留给垃圾收集器?虽然我认为我在谈论两件完全不同的事情......重点是,我应该像上面的例子那样关闭它吗?

2) Cursor也有一个.deactivate()方法,文档说它使用较少的资源(比活动游标).我什么时候应该使用它?例如,在我的应用程序中,我有一个ListActivity通过a填充SimpleCursorAdapter(代码初始化只调用一次).正在使用的游标是一个类成员变量,因为我需要在填充列表的方法之外.当从中删除某些内容时,我需要它来重新查询数据库.但是,除非删除记录,这是用户操作并且可能需要一段时间才会发生,我应该在此期间停用光标吗?因为当我.requery()再次打电话时它会再次激活.或者SimpleCursorAdapter由于光标不活动而停止工作?

编辑:我刚测试了这个,发现deactivate()在设置光标适配器后我无法调用.如果光标未激活,则列表将为空,因此只要显示ListActivity,它就需要保持活动状态.最后,我们应该让它StartManagingCursor处理它.或新的CursorLoader.

3)我知道startManagingCursor/ stopManagingCursor已被弃用但我不是针对Honeycomb(至少目前为止)并且我现在不想处理新CursorLoader的.但是在上面的教程中,startManagingCursor无处不在,但stopManagingCursor从未调用过一次.为什么不?Android会以自己的方式处理吗?我应该打电话的任何情况stopManagingCursor

Phi*_*art 9

编辑:更新的答案以反映更新的问题1:

1)每次调用fetchTodo时,都会创建并返回一个新游标.将前一个光标留给垃圾收集器.所以,如果我不使用startManagingCursor甚至CursorLoader那么,当我完成它时,我应该在光标上调用.close()吗?

是的,你绝对应该告诉Android startManagingCursor(),自己使用LoaderManager/ CursorLoaderclose()它.不这样做会泄漏内存,GC将无法帮助,因为它背后有本机资源Cursor(例如数据库的文件句柄).

2)Cursor也有一个.deactive()方法,文档说它使用的资源更少(比活动游标).我什么时候应该使用它?...

编辑给其他读者:OP找到答案并在他的问题中发布.以下仍然适用:

我从来没有用过deactivate()(没有deactive()),也许别人可以解释这个.如果你想要真正无痛的重新查询/更新,请查看LoaderManager框架 - 它不仅适用于Honeycomb:使用compat库你可以使用LoaderManager(和Fragments)到Android 1.6.它不仅减少了你编写的代码,而且完全将这些东西卸载到Android上,远远超过了startManagingCursor().

EDIT2:有些注意事项 LoaderManager

LoaderManagerdeveloper.android.com上有一些教程,但这些教程非常复杂,第一次很难理解,就像大多数教程一样.我也不得不深入挖掘,到目前为止我发现的最好的一体化停止是http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/(以及所有的javadoc和compat lib源码)你可以找到)--- LoaderManager工作方式非常类似于(现在也已弃用,取而代之DialogFragment)托管对话框onCreateDialog,onPrepareDialog其中你只需告诉Android"显示对话框#123",然后Android用你的ID调用你的代码; 同样适用于加载器:"load loader#123",Android调用onCreateLoader().

唯一明显的缺点是,最初,它LoaderManager严重依赖于ContentProvider框架,有些人似乎真的不喜欢这个.当然,它是额外的学习和代码,但是一旦你拥有了ContentProvider自己的数据(即使只在你的应用程序中私下使用),所有数据到视图的绑定都是轻而易举的CursorLoader.恕我直言,滚动你自己的"内容提供者"和实际实现之间没什么区别ContentProvider- 但这只是我极具争议的意见:)

3)我知道startManagingCursor/stopManagingCursor已被弃用,但我不是针对Honeycomb(至少目前为止),我现在不想处理新的CursorLoader.但是在上面的教程中,startManagingCursor在任何地方都使用,但是stopManagingCursor永远不会被调用一次.为什么不?Android会以自己的方式处理吗?我应该调用stopManagingCursor的任何情况?

一旦你调用startManagingCursor()Cursor不再是你的问题.Android将在您Activity被销毁时关闭Cursor (用户导航,方向更改,......).没有必要将呼叫startManagingCursor()与呼叫相匹配stopManagingCursor()- Cursor一旦你摆脱它,你通常不想承担再次管理的负担.