我使用Google App Engine(GAE),数据存储区(使用JDO)并使用Java进行操作。
我希望发生以下情况:
我们说我有以下型号:卡片,它只有一个字段,而且是创作时间(我称之为“#t;'”)。
我希望在发出GET请求时始终检索3个最新的Card实体。假设我目前在数据存储区中有5个卡实体,称为C1,C2 ... C5。它们按顺序插入,这意味着C5是最新的实体。
我现在执行我的GET请求,因此将获得实体:C5,C4和C3。在我使用客户端的实体后,让我们说5分钟后。我想检索接下来的3个最新实体。但是在这5分钟内,2个新卡已添加到数据存储区,现在看起来如下:C1,C2,C3,C4,C5,C6,C7。
我现在想要实际检索C7,C6以及最新但尚未检索到的卡,这意味着我也想要C2。即我想要C7,C6和C2。
我一直在尝试使用游标,而且似乎无法获得此行为。目前我正在使用查询对卡片进行升序排序,这意味着我将首先获得最旧的卡片,然后当我完成所有卡片时,Cursor实际上可以检测到何时添加了新条目并检索它们。但是如果自上次查询以来已经有超过3个添加它仍然会占用前3个(而不是最后3个),这意味着我将获得" new"牌。是否可以获得一个" end-cursor"没有真正走到尽头?如果有的话,我可能能够获得3张最新的最新卡片。
真实应用:想象一下9GAG的新鲜类别:最新的作品总是在顶部(简单)。但在我的应用程序中,以前的那些很可能永远不会再被看到,这意味着我想避免重复。所以它应该优先考虑最新的条目,当没有" new"卡片将继续在您上次离开的地方继续。
抱歉文字墙!并感谢任何反馈! :)
答案 0 :(得分:1)
我将提供一个工作来获得你想要的......当你正在处理实时变化时,
答案 1 :(得分:0)
感谢@Bharath鼓舞我/让我以其他方式思考。我的解决方案受您的解决方案的启发然而,你的解决方案有点过于简单,因为我只能检索绝对最新的条目而我真的想要旧的条目,如果没有新条目并且能够返回到先前的位置。
我的解决方案如下:
如果我有条目:C5,C4,C3,C2,C1。它们按ASC排序,这意味着它是最新的条目。
如在OP中的示例中,我想要检索3张卡。然后我检索C5,C4和C3并将C5的时间戳保存为“newestTime”并将C3的时间戳保存为客户端上的“oldestTime”。有了这两个,我可以模拟数据存储区中的游标行为。
下次我检索卡片时,我首先尝试获取时间戳大于“newestTime”的卡片,这意味着它们更新。如果我得到少于3个结果,我会通过获得时间戳低于“最旧时间”的卡片来获取剩余的卡片数量,这意味着它们是我没有得到的问题。因此,“oldestTime”的工作方式类似于指向您检索的最后一个条目的光标。当“newestTime”和“oldestTime”查询返回少于3个结果时,这意味着没有更多的结果是“看不见的”,这意味着我们必须从头重新开始,所以我们从中检索剩余的卡开始(并强制更新“oldestTime”)。导致我在OP中描述的确切行为。
一些想法: 我的猜测是这个解决方案比使用游标效率更低,因为我总是需要按时间戳进行过滤,这是一个正确的假设,还是游标的作用,但是在内部?