在Android SQLite中,直接使用Cursor处理数据比创建模型对象更节省内存?

5
在大多数Android示例代码中,从SQLite数据库填充ListView有两种方式:
  1. 预取数据到列表 - 执行查询,为每一行创建Model对象然后将其添加到List中并关闭Cursor,然后用List填充ListView。
  2. 不使用List和Model对象 - 执行查询并按需要使用moveToFirst、moveToLast、move遍历Cursor来填充ListView。
现在我想知道,在Android中,上述哪种方法更加内存高效?

1
考虑为涉及到“WHERE 子句”和“JOIN 约束条件”的字段进行索引。我平均性能提升了约 350 倍(是的,比未使用索引时快了三百五十倍)。 - Phantômaxx
在优化SQLite查询时添加索引是可以的。但是对于处理查询结果和相关选项呢?在这种情况下,您更喜欢第一种还是第二种?据我所知,第三种不是必需的,通过搜索有关游标的信息,我认为第三个选项也不是必须的。 - user4226071
@MohammedMT 我认为你应该在这里向DBA提问:http://www.dba.stackexchange.com - Krupal Shah
@userX:实际上是想知道在Android情况下哪个更节省内存。也许需要更改标题。 - user4226071
@MohammedMT 好的...明白了...现在标题很好。 - Krupal Shah
显示剩余7条评论
2个回答

5

Cursor 方法更加节省内存:

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

另一方面,如果您使用CursorAdapter,每当您需要用数据填充列表项时,您都会获得保存该行数据的光标,并且您只需选择实际需要在列表项中显示的列的数据。 无需创建1000个模型对象。

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


有没有参考资料可以学习Android如何在内部管理Cursor? - user4226071
1
我现在手头上没有具体的例子。我知道SQLiteCursor继承自AbstractWindowedCursor,这意味着它会在内存中保留当前位置周围的多行数据。如果想要了解所有内部信息,可以查看Android源代码,这通常很容易阅读,并且有非常好的注释。 - Ridcully

0

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


这是关于UI性能的问题。我需要知道如何管理查询结果,而问题更多地与该领域相关。 - user4226071
你不回答问题 ;) - mithrop
@mihthrop:什么答案?还有谁? :) - user4226071
@Mohammed:Blaze没有回答这个问题,而是讨论另一个点:使用Service来进行SQLite请求。这不是你的问题 ;) - mithrop
@mithrop: 好的...其实我是一个Android初学者。我看到很多例子都使用模型对象。所以我脑海中有这个疑问。所以我在这里发布了它。无论如何,我差不多得到答案了。我想Ridcully是正确的。 - user4226071
你的问题完全没问题。这是一个很好的观点,我对答案很感兴趣 ;) 如果可以的话,请接受 Ridcully 的答案 ;) - mithrop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接