android - 在 Android SQLite 中,直接使用 Cursor 比创建模型对象更节省内存?

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

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

  1. Prefetch data to List - 执行查询,为每一行创建 Model 对象,然后将其添加到 List关闭 光标,然后用 List 填充 ListView

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

现在我想知道,在 Android 中,上述哪种方法的内存效率更高?

最佳答案

Cursor 方法的内存效率更高:

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

另一方面,如果您使用 CursorAdapter,每当您必须用数据填充列表项时,您会得到一个 Cursor,该 Cursor 正好保存该行的数据,您可以简单地选择您实际需要在列表项中显示的列的数据。无需创建 1000 个模型对象。

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

关于android - 在 Android SQLite 中,直接使用 Cursor 比创建模型对象更节省内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26943924/

相关文章:

android - 如何正确使用多点触控 - MotionEvent.getActionIndex() 的用途?

java - 自定义布局,onMeasure/onLayout不断调用

android - 顶部和底部布局无法按预期工作

java - Libgdx - 如何加载一个巨大的 Sprite 表,使其不呈现黑色?

Android - 滚动时 ListView 图像随机播放

android - 单击 ListView 项时更改为特定 Activity

android - 以 su/root 身份打开任何 SQLiteDatabase

android-sqlite - 如何在 Android SQLite 中使用大于 CursorWindow 限制的图像?

android - 当使用单例作为数据库助手时,如何在恢复后刷新/重新打开 SQLite 数据库

ListView 中的Android多行项目