2011-01-20 83 views
9

我想使用GAE(Java)的Cursor功能为我的网站实现分页。但是,只有一个前向游标;从App Engine SDK 1.4.0开始,未实现反向游标。因此,为了实现前一页功能,建议将光标页面明智地存储在memchache中。但我的问题是 - 当新记录被添加到数据存储中时,相应页面的旧游标将失效。我如何处理这种情况?使用Google App Engine的分页技术

是否有人已经在Java中使用游标实现了此功能?请详细说明这个算法。

此外,我还没有看到一个具体的实现/例子在Java中相同。如果可能的话,你可以分享一些链接吗?

回答

9

如果您的解决方案是ajax-y,您可以将游标(作为字符串)保存在客户端的数组中,因此您不需要将其存储在memcache中。

当数据被添加(或删除/更改)时,旧游标不会失效。你仍然可以使用它们。就你而言,它们基本上代表了页面上的第一项。因此,唯一可能发生的情况是,如果您在结果的第3页上,然后导航回去然后转发,则可能看不到第3页中完全相同的实体。

例如,如果您从第2页第3页:

  • 第2页(光标= X2)的结果:[d,E,F,...,G]
  • 第3页(光标= X3)的结果:[H,I,J ,...]

然后,如果'e'被删除。向后走,第2页(cursor = x2)现在将显示[d,f,...,g,h],并且我们更新光标x3,因为它改变了(我们在第2页的每次fetch()后检查它)。现在,第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