2011-01-20 136 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