【问题标题】:Performance issues related to selecting all rows from a large database to populate a ListView与从大型数据库中选择所有行以填充 ListView 相关的性能问题
【发布时间】:2015-01-06 23:17:11
【问题描述】:

如果应用有一个包含大量行的本地数据库(我在想成百上千行,但为了论证,我们假设一百万或十亿行),将从 sql 查询返回所有行到光标并使用它来填充 ListView 会对性能产生负面影响?

请注意,(1)我不是在谈论返回所有列,这里讨论:

另外 (2),我不是在谈论与创建太多视图相关的性能问题。我理解回收视图的重要性,如下所述:

并且 (3),我不是在谈论从网络速度慢的远程服务器获取数据。该应用拥有自己的本地数据库。

所以基本上我是在询问游标适配器是否内置了任何东西来继续查询数据库,或者它是否一次返回所有数据。也就是说,我是否应该一次只返回 100 行,然后在用户滚动到最后一行时重新查询数据库以获取接下来的 100 行?

在我的特定情况下,我正在制作消息传递应用程序,以保存所有以前发送的消息的历史记录。用户可以在 ListView 中查看所有发送的消息。

【问题讨论】:

  • 你用的是什么适配器?
  • 所以你可以使用专门的 AbstractWindowedCursor 只保留小的 CursorWindow 以最小化使用的内存
  • 我向您推荐了 RecyclerView,它为大型数据集提供了有限的窗口。最终寻找无尽的回收视图。这是一个无尽的回收滚动监听器,当你到达最后时,你会加载更多数据gist.github.com/ssinss/…
  • @PanayiotisIrakleous 类型的视图与此无关,ListView 或 RecyclerView 几乎相同,重要的是适配器将数据映射到视图

标签: android mysql listview


【解决方案1】:

请通过此链接 (Answer) 了解尝试从表中获取大量行时可能出现的一些性能问题。

Android SQLite and huge data sets

另外,我建议部分检索结果并稍后使用 cursorjoiner。这是一个关于如何使用它的好例子。

http://chariotsolutions.com/blog/post/android-advanced-cursors/

【讨论】:

  • CursorJoiner 在这里没有用:可能 OP 可以使用 MergeCursor 但是当他的数据库真的很大时,它在这里也没有用,唯一的解决方案是自定义 AbstractWindowedCursor 具有固定大小的 CursorWindow 以便数据库大小无关紧要
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多