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

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

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

Cursor cursor = mNotesAdapter.fetchTodo();
// do something...
cursor.close();

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

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

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

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

解决方法

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

1) Every time a call is made to fetchTodo a new cursor will be created
and returned. Leaving the previous cursor for the garbage collector.
So,if I don’t use startManagingCursor or even the CursorLoader for
that matter,should I call a .close() on the cursor when I’m done with
it ?

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

2) Cursor also has a .deactive() method and the documentation says it
uses less resources (than active cursors). When exactly should I use
this? …

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

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

EDIT2:关于LoaderManager的一些注意事项

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

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

3) I know that startManagingCursor/stopManagingCursor are deprecated
but I’m not targeting Honeycomb (at least for the time being) and I
don’t want to deal with the new CursorLoader for now. But in the
tutorial above,startManagingCursor is used everywhere,but
stopManagingCursor is never called once. Why not? Does Android deals
with that in it’s own way? Any situation I should call
stopManagingCursor?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


更新Android SDK到3.0版本时,遇到Failed to rename directory E:\android\tools to E:\android\temp\ToolPackage.old01问题,导致无法更新,出现该问题的原因是由于3.0版本与较早的sdk版本之间文件结构有冲突,解决
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到back事件: 1)重写onKeyDown或者onKeyUp方法 2)重写onBackPressed方
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawable
Android中的"Unable to start activity ComponentInfo"的错误 最近在做一款音乐播放器的时候,然后在调试的过程中发现一直报这个错误"Unable to start activity ComponentInfo",从字面
Android 关于长按back键退出应用程序的实现最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面
android自带的时间选择器只能精确到分,但是对于某些应用要求选择的时间精确到秒级,此时只有自定义去实现这样的时间选择器了。下面介绍一个可以精确到秒级的时间选择器。 先上效果图: 下面是工程目录: 这个控件我也是用的别人的,好像是一个老外写的,com.wheel中的WheelView是滑动控件的主
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的item默认的外观,下面讲解以下在使用listview时最常见的几个问题。1.如何改变item的背景色和按
如何向Android模拟器中导入含有中文名称的文件在进行Android开发的时候,如果需要向Android模拟器中导入文件进行测试,通过DDMS下手动导入或者在命令行下通过adb push命令是无法导入含有中文文件名的文件的。后来发现借用其他工具可以向模拟器中导入中文名称的文件,这个工具就是Ultr
Windows 下搭建Android开发环境一.下载并安装JDK版本要求JDK1.6+,下载JDK成功后进行安装,安装好后进行环境变量的配置【我的电脑】-——>【属性】——>【高级】 ——>【环境变量】——>【系统变量】中点击【新建】:变量名:CLASSPATH变量值:……
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹出菜单,此时可以考虑用PopupWindow来实现。下面就来介绍一下如何使用PopupWindow实现一个弹出窗。 主Activity代码:public void onCreat
解决Android中的ERROR: the user data image is used by another emulator. aborting的方法 今天调试代码的时候,突然出现这个错误,折腾了很久没有解决。最后在google上找到了大家给出的两种解决方案,下面给出这两种方法的链接博客:ht
AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory;
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY。 |值|说明| |:--:|:--| |center|保持原图的大小,显示在ImageVie
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win10/Android studio 3.21.环境配置 在SDK Tools里选择 CMAKE/LLDB/NDK点击OK 安装这些插件. 2.创建CMakeLists.txt文件 在Project 目录下,右键app,点击新建File文件,命名为CMakeLists.txt点击OK,创建完毕! 3.配置文件 在CMa..._link c++ project with gradle
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由mainActivity界面跳转到otherActivity界面1.写好两个layout文件,activity_main.xml和otherxml.xmlactivity_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout ="http://schemas..._android studio 界面跳转
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件来用,然后发现了这两款神作,都是外国的软件,而且都是开源的软件,因此把源码下载了下来,给有需要研究代理这方面的童鞋看看。不得不说,国外的开源精神十分浓,大家相互使用当前基础的开源软件,然后组合成一个更大更强的大开源软件。好吧,废话不多说,下面简单介绍一下这两款开源项目。一、ProxyDroid:ProxyDroid功能比较强大,用到的技术也比较多,源码也_proxydroid
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项目时Gradle Build 窗口却显示错误:程序包R不存在通常情况下是不会出现这个错误的。我是怎么遇到这个错误的呢?第一次创建项目,company Domain我使用的是:aven.com,但是创建过程在卡在了Building 'Calculator' Gradle Project info这个过程中,于是我选择了“Cancel”第二次创建项目,我还是使用相同的项目名称和项目路_r不存在
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上使用系统自带的代理,限制灰常大,仅支持系统自带的浏览器。这样像QQ、飞信、微博等这些单独的App都不能使用系统的代理。如何让所有软件都能正常代理呢?ProxyDroid这个软件能帮你解决!使用方法及步骤如下:一、推荐从Google Play下载ProxyDroid,目前最新版本是v2.6.6。二、对ProxyDroid进行配置(基本配置:) (1) Auto S_proxydroid使用教程
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供了一个很实用的工具Android设备监视器(Android device monitor),该监视器中最常用的一个工具就是DDMS(Dalvik Debug Monitor Service),是 Android 开发环境中的Dalvik虚拟机调试监控服务。可以进行的操作有:为测试设备截屏,查看特定进程中正在运行的线程以及堆栈信息、Logcat、广播状态信息、模拟电话_安卓摄像头调试工具