我想使用GAE(Java)的Cursor功能为我的网站实现分页。但是,只有一个前向光标;从App Engine SDK 1.4.0开始,未实现向后游标。因此,为了实现上一页的功能,建议我将光标页存储在memchache中。但我的问题是 - 当新记录添加到数据存储区时,各个页面的旧游标将变为无效。我该如何处理这种情况?
之前是否有人已经使用Java中的游标实现了此功能?请详细说明这个算法。
此外,我还没有在Java中看到相同的具体实现/示例。如果可能的话,请你分享一些链接。
答案 0 :(得分:9)
如果您的解决方案是ajax-y,您可以将游标(作为字符串)保存在客户端的数组中,这样您就不需要将它存储在内存缓存中。
添加(或删除/更改)数据时,旧游标不会失效。你仍然可以使用它们。在您的情况下,它们基本上代表页面上的第一个项目。因此,唯一可能发生的事情是,如果您在结果的第3页上并向后导航然后向前,您可能看不到您在第3页之前所做的完全相同的实体。
例如,如果您从第2页到第3页:
然后,如果'e'被删除了。向后,第2页(光标= x2)现在将显示[d,f,...,g,h],并且我们更新了光标x3,因为它已经更改(我们在第2页的每次获取()之后检查它)。展望未来,第3页现在将[i,j,...]
同样,如果在'e'之后添加了'e2',那么回到第2页我们会[d,e,e2,f,...]和x3得到更新。然后,第3页将包含[g,h,i,j,...]
唯一需要注意的是第一页永远不应该使用游标(如果元素在第一页之前添加),你应该总是允许用户“尝试”转到下一页,以防添加元素在最后的结果之后。
因此,页码不是非常具体,但在处理分页数据时它们不能真正用于更新。一个技巧是不使用页码,而是将页面标记为“以元素x开头的数据”或类似的东西。
我不知道任何实现,但实施起来应该是非常严格的。文档中描述了游标功能:http://code.google.com/appengine/docs/java/datastore/queries.html#Query_Cursors