【问题标题】:RecyclerView, database binding and memory designRecyclerView、数据库绑定和内存设计
【发布时间】:2018-08-12 04:33:31
【问题描述】:

我是 Android 开发新手,第一次尝试在 RecyclerView 和 SQLite 数据库之间实现数据绑定。现在我一直在搜索有关该主题的示例和教程,但发现的信息比我预期的要少。

我找到的几个解决方案,例如:Display SQLite data in RecyclerView,似乎总是在数据库中查询 所有 数据,将其递归存储到 List 中,然后将其传递给 RecyclerView.Adapter .然后,适配器类通过引用 List<Item> 中的项目来浏览项目。

现在来回答实际问题:这个解决方案聪明吗?我是一个爱好程序员,因此我远不是数据库和/或内存设计的专家。这个解决方案虽然让我很头疼,因为查询数据库中的所有项目并将它们存储在一个数组中似乎不仅破坏了查询 SQLite 数据库的优势,而且似乎有污染内存的风险(从而下降表现)。因此:是否有更好的解决方案将数据库数据绑定到 RecyclerView 或者 Array<Item>-Query-All-Solution 是否适合此目的?

【问题讨论】:

  • 你绝对 100% 正确 - 使用 this 适配器甚至更好:github.com/blandware/android-atleap/blob/master/atleap-core/src/… - 对于这个我不知道作者为什么决定让它成为 abstract - 你可以简单地删除它关键字
  • 不:不要使用任何分页:查询本地 sqlite 数据库的最糟糕的想法
  • @pskink:顺便说一句,你为什么称它为“最坏的主意”?
  • @pulp_fiction 因为不清楚如何正确实施它,它很慢,糟糕的用户体验设计,最终也可能导致OutOfMemoryErrors
  • @pskink : 那么你打算如何获取 1000 或 100 万条记录?

标签: android database sqlite


【解决方案1】:

我认为,您正在寻找分页。分页用于从数据库中有限检索结果,此处用于 SQLLite(请注意此处的限制)。例如:

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100

Efficient paging in SQLite with millions of records.

什么是分页?

如果您有一个表单允许用户浏览 一个数据库表,如果该表有数百甚至是怎么办 数千行?显示所有这些行不是一个好主意 以单一形式,您应该将数据库输出拆分为 更易于管理的块或“页面”。您必须做两件事:

  • 确定每个页面中可以包含的最大数据库行数。你可以硬编码这个值,或者
  • 您可以在变量中定义它,以便在 运行时。

然后,您需要通知用户其他“页面”可用,并提供一种机制,让用户能够选择不同的 详细信息的“页面”。

然后,每当有新数据出现时,请在适配器上调用 notifyDatasetChanged() 以刷新它。

分页参考:https://www.tonymarston.net/php-mysql/pagination.html

【讨论】:

  • 当然……我其实没有想过正确的概念。分页已经是实现适配器的一个更好的主意。尽管如此,这仍然留下了一个问题,即多少行分页开始成为性能所必需的。
  • @m.a.正确的数量是对您的用户体验至关重要的数量。例如,在搜索时,您可以估计用户平均实际点击了多少搜索结果(页面)。然后据此设置页面限制。它是页面限制的调整过程,最终取决于您的需求。
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多