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

2023-11-23

为了在我的应用程序中实现数据库访问,我遵循拉尔斯·沃格尔教程,但我对一些事情感到非常困惑......

  1. 每次拨打电话时fetchTodo将创建并返回一个新游标。将前一个光标留给垃圾收集器。所以,如果我不使用startManagingCursor甚至是CursorLoader为此,我应该打电话给.close()当我完成后在光标上?在外面fetchTodo当然范围,例如:

    光标cursor = mNotesAdapter.fetchTodo(); // 做一点事... 光标.close();

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

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

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

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

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

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

是的,你绝对应该告诉 AndroidstartManagingCursor(), use LoaderManager/CursorLoader or close()你自己吧。不这样做会泄漏内存,GC 对此无济于事,因为背后有本机资源Cursor(例如数据库的文件句柄)。

2) Cursor 还有一个 .deactive() 方法,文档中有说明 使用更少的资源(比活动游标)。我到底应该什么时候使用 这? ...

EDIT致其他读者:OP找到了答案并将其发布在他的问题中。以下内容仍然成立:

我从来没有用过deactivate()(没有deactive()),也许其他人可以解释这一点。如果您想要真正轻松的重新查询/更新,请查看LoaderManager框架——它不仅仅适用于 Honeycomb:使用您可以使用的 compat 库LoaderManager (and Fragments)降至 Android 1.6。它不仅减少了您需要编写的代码,而且将这些事情完全卸载到 Android,比startManagingCursor().

EDIT2:一些注释LoaderManager

LoaderManagerdeveloper.android.com 上的教程,但这些教程非常...复杂且难以理解,就像那里的大多数教程一样。我还必须挖掘很多,迄今为止我发现的最好的一站式服务是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)我知道 startManagingCursor/stopManagingCursor 已被弃用 但我的目标不是 Honeycomb(至少暂时如此)并且我 现在不想处理新的 CursorLoader。但在 上面的教程中,startManagingCursor 到处都用到了,但是 stopManagingCursor 永远不会被调用一次。为什么不?安卓有优惠吗 以它自己的方式?任何情况我应该打电话 停止管理光标?

一旦你打电话startManagingCursor() the Cursor不再是你的问题。 Android 将在您关闭光标时负责关闭光标Activity被破坏(用户导航离开,方向改变,...)。无需匹配调用startManagingCursor()打电话给stopManagingCursor()——你通常不想承担管理一个Cursor一旦你摆脱它,再一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 Firebase 数据填充 Android spinner

    我在填充时遇到一些问题propertyAddress从我的properties桌子到我的旋转器MaintenanceActivity 问题本身不在于代码 而在于可以使用 Firebase 控制台修改的数据库规则 目前 我的规则是这样的 ru
  • SQLite 数据库安全

    我正在构建一个使用 Sqlite DB 的应用程序 用户可以将他们的信息输入数据库并检索它们 但是 我希望他们能够备份 sqlite 数据库 我所做的是将 sqlite 数据库放入文档文件夹中 以便他们可以使用 iTunes 将其检索出来
  • Android spinner 将多列(连接)Sqlite 数据库加载到表中

    我正在学习如何创建一个从 SQLite 加载下拉列表的微调器 我有一个由旋转器和表格组成的用户界面 如果用户单击微调器 表的内容将根据微调器上选定的 ID 根据数据库加载 如果未选择名称 它将加载表中的所有内容 但是我找不到如何根据微调器上
  • 以编程方式设置 windowlightstatusbar 属性

    如您所知 我们可以设置windowLightStatusBar通过以下代码从 xml 中获取
  • 更改 Android 应用程序的所有字体[重复]

    这个问题在这里已经有答案了 如何更改 Android 应用程序的整个字体 以前我看到这个帖子 https gist github com artem zinnatullin 7749076在 github 上 该解决方案仅适用于低于 api
  • 如何在无头Linux中更新Android平台工具?

    我们有一些没有安装 X Window 的 CI 主机 我知道如何使用 android 更新命令更新 SDK 但如何使用此命令更新平台工具 您可以使用以下命令 android list sdk android update sdk no ui
  • 更新到最新版本(3.1)后缺少 google-play-services_lib.jar

    我在我的应用程序中使用 Google Play 服务已经有一段时间了 没有出现任何问题 我正在使用 Eclipse 我已在 I O 后将播放服务 以及 ADT 和 SDK 更新到最新版本 但现在我无法构建我的应用程序 我已将 google
  • 如何在Android中以编程方式替换视图? [复制]

    这个问题在这里已经有答案了 我有一个复杂的视图 包含多个子视图 例如文本视图和图像视图 我想用另一个 派生的 图像视图替换其中一个图像视图 另一个支持在后台加载图像 如何用新的图像视图替换原始图像视图 我目前的解决方案只是复制粘贴整个 XM
  • 使用 OpenWeatherMap API 密钥

    我得到异常 http api openweathermap org data 2 5 weather q 悉尼 http api openweathermap org data 2 5 weather q Sydney 有人可以帮助如何使用
  • 使用协程对任务进行排队

    我最近开始阅读有关协程的内容 我想询问某个场景 考虑一个带有一个按钮的简单屏幕 单击后 它会执行一堆打印语句和一些延迟 其间 到目前为止 我正在使用协程来实现这一目标 现在 我的问题是 如果用户反复向该按钮发送垃圾邮件 是否有一种方法可以将
  • 将对象传递给活动

    我可以在第一个活动中初始化对象并在所有活动中初始化对象吗 public class Calc int x int y public Calc int x int y this x x this y y public int sum retu
  • RecyclerView onClick notificationItemRemoved 不会触发 onBindView

    I use notifyItemRemoved 方法我想更改其他剩余项目 但该方法没有触发onBindView 方法 除了使用notifyDataSetChanged 我想要附带的动画notifyItemRemoved method 如果您
  • Firebase 邀请发送电子邮件,但不发送短信。返回结果代码 0

    我正在尝试使用 Firebase 在我的 Android 应用程序中实现应用程序邀请系统 该代码与他们中给出的完全相同guide https firebase google com docs invites android private
  • Android 上的 Facebook 社交插件

    我想集成 Facebook 的评论社交插件 https developers facebook com docs reference plugins comments https developers facebook com docs r
  • Corebluetooth 方法 scanForPeripheralsWithServices 在任何设备中都不适用于我。所有 github 示例均不适用于我的设备 ipod touch

    我正在开发蓝牙相关的应用程序 但我没有取得任何成功 在我的应用程序中 我想将我的 iDevice 与任何其他正在扫描的蓝牙设备连接 但使用 CBCentralManager 方法 scanForPeripheralsWithServices
  • 如何在flutter app android中添加Startapp广告?

    我想用其他广告更改 AdMob 广告 一些个人问题 如何在flutter app android中添加Startapp广告 有什么方法可以将启动广告添加到我的 flutter 应用程序 android 中 StartApp 现已更名为 St
  • Android 中应用程序在后台运行时如何显示闪屏?

    我的应用程序有一个启动屏幕 无法避免它 因为这是出于品牌原因 我想屏蔽用户界面并在后台显示启动屏幕 就像银行应用程序那样 我应该覆盖 MainActivity 中视图的 onPause 和 onResume 吗 显现
  • 将 Spritekit 游戏转换为 Android?

    是否有任何新选项可以将 spritekit 游戏转换为 Android 游戏 似乎唯一的选择是用 Java 重新编码所有内容或使用 Cocos2D LibGDX 等 很不幸的是 不行 而且带有 Apportable 服务的跨平台 Sprit
  • 使用 Ant 构建 Android 库项目

    我在使用 ant 构建 Android 库项目时遇到问题 当我尝试跑步时ant release 它说Target release does not exist in the project MyProject 然后我假设库可能无法通过发布
  • 片段已添加 IllegalStateException

    我在容器 Activity 上使用此方法来显示 BFrag public void showBFrag Start a new FragmentTransaction FragmentTransaction fragmentTransact

随机推荐

  • 为什么shortValue()方法是具体的,而intValue()方法是抽象到java.lang.Number中的?

    我已经阅读了源代码java lang Number我想知道为什么 intValue longValue floatValue doubleValue 是抽象的但是 shortValue byteValue 混凝土 源代码 public ab
  • OpenCart 中基于路由向页面添加 CSS 样式表

    我正在为客户端商店使用 opencart 版本 1 5 1 3 1 并且想知道对其进行编码的最佳方法是什么 以便我可以为某些路线添加某些样式表 例如 在我的类别页面上 我希望有一个与默认样式不同的样式表 或者一个将使用我的自定义表覆盖默认样
  • 当可观察数组为空时如何显示无数据?

    我是 Knockout js 的新手 我正在尝试将数据从可观察数组显示到table 我遇到的问题是它生成两个tbody标签 但是如果我将空检查逻辑移入foreach 循环 No Data确实出现了 有没有更好的方法来使用表来做到这一点 我不
  • 如何将 Servlet 重定向到给定的 URL

    目前 我正在使用 request getRequestDispatcher thePage html forward request response 在我的 servlet 中向用户显示新页面 但 servlet 的 URL 保留在浏览器
  • 如何将以前版本的 Python 安装到 virtualenv 中? [复制]

    这个问题在这里已经有答案了 我在全局安装了Python3 然后创建了一个virtualenv 现在我想把里面的python版本改成Python2 7 尝试安装Python2 7时我只能选择安装到我的硬盘上 如何指定 virtualenv 中
  • Nhibernate 标准:“选择 max(id)...”

    我可以使用 Criteria 执行 t sql 命令来选择表中列的最大值吗 从客户中选择 cus id max id 1 Ta Ollie Use 投影 session CreateCriteria typeof Customer SetP
  • 实例作为静态类属性

    是否可以在 PHP 中将类的实例声明为属性 基本上我想要实现的是 abstract class ClassA static property new ClassB 好吧 我知道我不能这样做 但是除了总是做这样的事情之外还有什么解决方法吗 i
  • Reactjs 可以以编程方式处理 :before 吗?

    我必须以某种方式以编程方式设置宽度 before for a div div div 我如何定义someStyle这样的宽度 before of something div可以相应改变吗 是的 您可以通过编程方式更改 React 中的 be
  • 如何使用 Indy 10 和 OpenSSL 通过 HTTPS 下载文件?

    我有以下任务 使用 HTTPS 和身份验证下载文件 Indy 似乎是可行的方法 但由于某种原因它到目前为止还不起作用 我已做好以下准备 我用于下载的 TIdHTTP 组件 用于创建 URL 的 TIdURI 组件 应提供安全连接的 TIdS
  • 如何针对多个验证组进行验证?

    我有两个验证组 父组和子组 我有一个添加按钮 只需验证子验证组 这很容易完成 保存按钮需要针对客户端和服务器端的父验证组和子验证组进行验证 我想我知道如何通过为每个组调用 Page Validate groupname 方法来在服务器端完成
  • 使用 C# 中的 .Pem/.Pkcs8 密钥文件中的 MD5WithRSA 对数据进行签名

    我有以下 Java 代码示例 我需要在 C 中重新制定它 PKCS8EncodedKeySpec privKeySpec new PKCS8EncodedKeySpec pkcs8PrivateKey KeyFactory keyFacto
  • clang 和 gcc 之间 const 引用三元运算符的地址差异

    我对这里发生的事情有一个模糊的想法 这与this但我想知道为什么 clang 和 g 处理这个问题的方式不同 这里未定义的行为在哪里 注意 这与模板无关 我只是使用它们来使示例更加紧 凑 这都是关于类型的whatever include
  • 实用程序类是邪恶的吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我看到这个问题 如果 实用程序 类是邪恶的 我该将通用代码放在哪里 我想 为什么实用程序类是邪恶的 假设我有一个深度为数十个类的领域模型 我需要能够对实例进行 xml 化 我是否在父级上创
  • 为什么 for_each 不能修改其函子参数?

    http www cplusplus com reference algorithm for each 一元函数取一个元素 范围作为参数 这可以 是一个指向函数或 其类重载的对象 操作员 它的返回值 如果有的话 被忽略 根据这篇文章 我预计
  • 整数除法返回 0

    我觉得我错过了一些明显的东西 我正在尝试测试的分布random 这是表格 create table test id int random float float random int int 这是我想做的 truncate table te
  • Sphinx HTML 输出的搜索功能的不同 URL 参数有何影响?

    Sphinx 生成的 HTML 文档包括一个搜索界面 例如 在 Python 官方文档中搜索术语 popen 时 将构造以下 URL 不同的 URL 参数有什么影响 Sphinx 生成的 HTML 文档的搜索执行完全基于 JavaScrip
  • 出现滚动条时 FireFox 中的长页面偏移

    在 Firefox 和 Safari 中 当页面足够长以显示滚动条时 居中的页面会移动几个像素 如果您浏览一个具有长页面和短页面的网站 页面似乎会 跳跃 IE7 倾向于让滚动条始终可见 但在页面不够长时将其禁用 由于 HTML 窗口的宽度永
  • Symfony 4 - KnpPaginator Bundle“找不到服务,即使它存在于应用程序的容器中”

    我一直在关注教程 所有说明都显示它是以完全相同的方式完成的 但它似乎在 Symfony 4 中不起作用 是否有我忽略的东西 或者捆绑包根本不兼容 I ran composer require knplabs knp paginator bu
  • 如何使用 jest 和 React 测试库测试调用提交表单的按钮

    所以我试图测试 onSubmit 函数是否在单击按钮时被触发 我这样做的方式是通过测试 onSubmit 函数的内部正在获取调用 axios post 方法 the test describe RecipeSearch gt test su
  • 关于Android中SQLite数据库游标的几个问题

    为了在我的应用程序中实现数据库访问 我遵循拉尔斯 沃格尔教程 但我对一些事情感到非常困惑 每次拨打电话时fetchTodo将创建并返回一个新游标 将前一个光标留给垃圾收集器 所以 如果我不使用startManagingCursor甚至是Cu