分页读取数据存储区的问题

时间:2014-07-04 05:57:06

标签: google-cloud-datastore

我有一个问题,我无法相信这样一个共同的功能可能被打破(错误确实在我身边),但我找不到如何让它工作。我想使用数据存储区中的光标来获取分页结果,不管我做什么都会得到它们

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个元素,我从第一个查询中收到)

1 个答案:

答案 0 :(得分:0)

当您使用QueryResultList时,请求的光标将始终指向列表的末尾。由javadoc of QueryResultList#getCursor指定:

Gets a Cursor that points to the result immediately after the last one in this list.

即使您提供预取和块大小,整个结果列表仍将包含您的所有结果,因为您尚未指定限制。因此,期望的光标是最后一个元素之后的光标。

如果您每页只需要特定数量的实体,则应使用limit methodFetchOptions设置限制。然后,当您致电getCursor()时,您将在页面末尾获得一个光标,而不是数据集的末尾。

相反,您也可以使用QueryResultIterator。与QueryResultList不同,在getCursor上调用QueryResultIterator将导致光标指向通过调用.next()javadoc)检索到的最后一个实体之后。