【问题标题】:Infinite scroll and duplicated data无限滚动和重复数据
【发布时间】:2016-10-12 07:36:34
【问题描述】:

我在一个移动应用程序上工作,该应用程序显示从服务器获取的数据流。最初,该应用程序获取包含 10 个项目的第一页。当用户向下滚动时,应用程序会获取第二页以及接下来的 10 个项目(换句话说 - 无限滚动)。我遇到的问题是,当用户 A 获取页码 X 时,用户 B 可能会在服务器上创建一个新内容,该内容会修改用户 A 可用的结果集。这意味着如果用户 A 尝试获取 X +1 页面,它将包含被新内容“推回”的先前项目。如何解决?我提出了两种解决方案,但我不知道哪个更好:

  1. 移动应用程序会记住已显示项目的 ID,如果在下一页中有已显示的项目,则不会再次显示。
  2. 应用程序会记住第一页中第一个项目的创建日期。当它获取下一页时,它还会将此日期发送到服务器,服务器将此日期添加到 sql 查询中以维护相同的结果集

你怎么看?哪个更好?有没有更好的解决方案?

更新:

想象一下,我有一个表“查询”,其中包含“查询 ID”(整数、主键)、“日期创建”(时间戳)列。我的查询如下所示: select * from queries order by date_created desc。 date_created date_created 不随主键递增而递增。我使用 Pageable 对象使用 Spring Data 对数据进行分页。现在的问题是,如果创建了新行并且它们的 date_created 比之前的最新行更新,那么它们会修改结果集。

【问题讨论】:

  • 如果分页是根据记录id进行的,那么用户B的任何修改都不会影响用户A的结果。id总是递增的
  • 此外,您应该标记您正在使用的技术,以吸引更多观众关注您的问题,从而让更多人指出最佳做法
  • SQL 查询不考虑 id。它们按创建日期排序。但是你写的不是真的。如果我进行 sql 查询,将结果从 a 提取到 b,然后从 c 提取到 d,那么在这些查询期间,新行可能会修改结果集。这是我的问题。在这里你可以看到一个例子:pixafy.com/blog/2013/09/…
  • SQL queries do not take ids into account 那么这是一种错误的方法。使用日期范围进行分页效率非常低。
  • 所以请解释更好的解决方案。

标签: ios postgresql pagination spring-data infinite-scroll


【解决方案1】:

发生这种情况是因为您仅基于 date_created 进行分页。
我假设您使用ORDER BY date_created DESC 进行查询,并且您为当前页面偏移。
为避免您的问题,您需要在查询中添加上一个 fetch 的最后一个 id。 IE。 queries_id < last_id ORDER BY date_created ....

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2013-01-16
    • 2016-11-25
    • 2019-08-19
    相关资源
    最近更新 更多