我目前有一个使用活动/地点和 AsyncDataProvider 的应用程序。
现在,每次活动加载时 - 它使用请求工厂来检索数据(目前不是很多,但很快就会变得非常大)并将其传递给视图以更新 DataGrid。在更新之前,它会根据搜索框进行过滤。
现在 - 我已经实现了更新 DataGrid 如下:(这段代码不是最漂亮的)
private void updateData() {
final AsyncDataProvider<EquipmentTypeProxy> provider = new AsyncDataProvider<EquipmentTypeProxy>() {
@Override
protected void onRangeChanged(HasData<EquipmentTypeProxy> display) {
int start = display.getVisibleRange().getStart();
int end = start + display.getVisibleRange().getLength();
final List<EquipmentTypeProxy> subList = getSubList(start, end);
end = (end >= subList.size()) ? subList.size() : end;
if (subList.size() < DATAGRID_PAGE_SIZE) {
updateRowCount(subList.size(), true);
} else {
updateRowCount(data.size(), true);
}
updateRowData(start, subList);
}
private List<EquipmentTypeProxy> getSubList(int start, int end) {
final List<EquipmentTypeProxy> filteredEquipment;
if (searchString == null || searchString.equals("")) {
if (data.isEmpty() == false && data.size() > (end - start)) {
filteredEquipment = data.subList(start, end);
} else {
filteredEquipment = data;
}
} else {
filteredEquipment = new ArrayList<EquipmentTypeProxy>();
for (final EquipmentTypeProxy equipmentType : data) {
if (equipmentType.getName().contains(searchString)) {
filteredEquipment.add(equipmentType);
}
}
}
return filteredEquipment;
}
};
provider.addDataDisplay(dataGrid);
}
最终 - 我想做的只是首先加载必要的数据(此应用程序中的默认页面大小为 25)。
不幸的是,就我目前的理解而言,对于 Google App Engine,任何 ID 都没有顺序(一个条目的 ID 为 3,下一个条目的 ID 为 4203)。
我想知道,使用 Objectify 时从 Google App Engine 检索数据子集的最佳方法是什么?
我正在研究使用偏移和限制,但另一个堆栈溢出帖子(http://stackoverflow.com/questions/9726232/achieve-good-paging-using-objectify)基本上说这是低效的。
我找到的最佳信息是以下链接(http://stackoverflow.com/questions/7027202/objectify-paging-with-cursors)。这里的答案说使用游标,但也说这是低效的。我也在使用请求工厂,所以我必须将光标存储在我的用户会话中(如果不正确,请告诉我)。
目前因为不太可能有很多数据(未来几个月总共可能有 200 行),所以我只是将整个数据集作为临时黑客撤回给客户端 - 我知道这是最糟糕的方法但想在浪费我的时间实施另一个黑客解决方案之前获得最好的方法。我目前很担心,因为似乎我读过的每一篇关于这样做的文章都让人觉得没有真正可靠的方法来做到这一点。
我也在考虑做什么 - 目前我的搜索/页面加载速度非常快,因为所有数据都已经在客户端。我在搜索框中使用 KeyUpEvent 处理程序来过滤数据 - 我认为没有任何方法可以通过调用服务器来保持这个速度 - 这个问题是否有任何可接受的解决方案?
非常感谢