【问题标题】:In Android SQLite, working directly with Cursor is more memory efficient than creating Model Objects?在 Android SQLite 中,直接使用 Cursor 比创建模型对象更节省内存?
【发布时间】:2014-11-15 08:10:45
【问题描述】:

在大多数 Android 示例代码中,从 SQLite 数据库填充 ListView 有两种方式,

  1. 将数据预取到列表 - 执行查询,为每一行创建模型对象,然后将其添加到 列表关闭 光标,然后用 List 填充 ListView

  2. 没有 List 和 Model 对象 - 使用 moveToFirst 跟随 Cursor 执行查询并填充 ListView >、moveToLastmove,根据需要。

现在我想知道,在 Android 中,上述哪种方法更节省内存?

【问题讨论】:

  • 100 万 * 5KB 是 5 GB,对吗???
  • 不准确计数。但想知道,如果它有那么大的尺寸吗?无论如何我都会更新问题,使其达到 500MB。
  • 现在好多了,可以接受... :)
  • 好的,但我想知道处理此案的最佳做法。
  • 考虑索引 WHERE 子句 以及JOIN 约束 中涉及的字段。我的平均性能提升了大约 350 倍(是的,比没有索引时快 350 倍)

标签: android android-listview android-sqlite android-cursor android-memory


【解决方案1】:

Cursor 方法更节省内存:

假设您的数据库中有 1000 个条目,并且您有一个可以同时显示 10 个条目的 ListView。如果您首先创建一个列表,则必须创建 1000 个模型对象(每个模型对象又由几个对象组成,具体取决于表的列数),并且列表视图会创建额外的 10 个视图(实际上更多,取决于在列表的布局上)用于显示 10 个项目。现在,当用户滚动列表时,在您的适配器中,您最终会将数据从模型对象复制到当前视图中的列表项视图。

另一方面,如果您使用CursorAdapter,则无论何时您必须用数据填充列表项,都会为您提供精确保存该行数据的光标,您可以简单地选择列的数据您实际上需要在列表项中显示。无需创建 1000 个模型对象。

从代码可读性的角度来看,模型方法会更好,因为使用游标的级别非常低,您需要知道数据库中列的名称等等。

【讨论】:

  • 有任何参考资料来了解 Android 如何在内部管理光标?
  • 我现在手头没有特定的。我知道 SQLiteCursor 继承自 AbstractWindowedCursor,这意味着它在内存中的当前位置周围保留了许多行。要了解有关内部结构的所有信息,您可以查看(大多数情况下)非常容易阅读并且具有非常好的 cmets 的 Android 源代码。
【解决方案2】:

我认为您需要使用 Service 或至少 Thread/Async 以便您的 UI 线程不会被阻塞。 Service 更好,因为人们可以在下载的同时访问其他应用程序。您可以使用BroadcastReceiver 与您正在运行的Service 进行通信。

【讨论】:

  • 这是关于 UI 性能的。我还需要知道如何管理查询结果,并且问题与该领域更相关。
  • 你没有回答问题 ;)
  • @mithrop: 什么答案?还有谁 ? :)
  • @Mohammed:Blaze 不回答这个问题并讨论另一点:使用 Service 发出 SQLite 请求。这不是你的问题;)
  • @mithrop:Okey...实际上我是 Android 的初学者。我看到了很多使用模型对象的例子。所以我心里有这个疑问。所以我把它贴在这里。无论如何,我几乎得到了答案。我认为 Ridcully 是对的。
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2017-11-20
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多