我有一个问题,我无法相信这样一个共同的功能可能被打破(错误确实在我身边),但我找不到如何让它工作。我想使用数据存储区中的光标来获取分页结果,不管我做什么都会得到它们
FetchOptions fetchOptions = FetchOptions.Builder.withChunkSize(5).prefetchSize(6);
String datastoreCursor = filter.getDatastoreCursor();
if (datastoreCursor != null) {
fetchOptions = fetchOptions.startCursor(Cursor.fromWebSafeString(datastoreCursor));
}
QueryResultList<Entity> result = preparedQuery.asQueryResultList(fetchOptions);
ArrayList<Product> productList = new ArrayList<Product>();
// int count = 0;
for (Entity entity : result) {
// if (++count == PRODUCTS_PER_PAGE)
// break;
Key key = entity.getKey();
productList.add(populateProduct(key.getId(), true, entity));
}
toReturn.setDatastoreCursor(result.getCursor());
此外,如果我没有读取行(使用counter
取消注释行)并获得光标,则生成的光标是相同的。我以为它可能会让我回到datastabase游标下的最后一个读取元素(思考result.getCursor()
反映了db游标的状态)
我得到一个带有此值E-ABAOsB8gEQbW9kaWZpY2F0aW9uRGF0ZfoBCQiIjsfAmKm_AuwBggIhagljaGF0YW1vamVyFAsSB1Byb2R1Y3QYgICAgICosgsMFA
的光标,指向不再有元素(我的测试中有23个元素,我从第一个查询中收到)
答案 0 :(得分:0)
当您使用QueryResultList
时,请求的光标将始终指向列表的末尾。由javadoc of QueryResultList#getCursor
指定:
Gets a Cursor that points to the result immediately after the last one in this list.
即使您提供预取和块大小,整个结果列表仍将包含您的所有结果,因为您尚未指定限制。因此,期望的光标是最后一个元素之后的光标。
如果您每页只需要特定数量的实体,则应使用limit
method对FetchOptions
设置限制。然后,当您致电getCursor()
时,您将在页面末尾获得一个光标,而不是数据集的末尾。
相反,您也可以使用QueryResultIterator
。与QueryResultList
不同,在getCursor
上调用QueryResultIterator
将导致光标指向通过调用.next()
(javadoc)检索到的最后一个实体之后。