android sqlite 数据库 cursor,关于Android中SQLite数据库游标的几个问题

Philipp Reic..

9

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

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

是的,你绝对应该告诉Android startManagingCursor(),自己使用LoaderManager/ CursorLoader或close()它.不这样做会泄漏内存,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一旦你摆脱它,你通常不想承担再次管理的负担.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值