1

我目前有一个使用活动/地点和 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 处理程序来过滤数据 - 我认为没有任何方法可以通过调用服务器来保持这个速度 - 这个问题是否有任何可接受的解决方案?

非常感谢

4

1 回答 1

2

使用光标。它们尽可能高效 - 游标存储最后一个查询结束的点并从那里继续。您链接的答案实际上并未讨论游标与偏移的效率。(有评论是错误的)

您可以将限制与游标一起使用 - 它不会影响效率。

此外,游标可以cursor.toWebSafeString()通过 RPC 序列化并发送到客户端。这样您就不需要将它们保存在会话中。实际上,您也可以将它们用作片段标识符(在 GWT 用语中也称为历史标记) - 这样可以为结果集的某个“页面”添加书签。

(偏移是“低效的”,因为它实际上加载并向您收费,对于所有直到偏移+限制的实体,它只返回限制实体)

OTOH,如果您在页面加载时已经知道查询参数,那么只需在页面生成时进行查询,而不是通过 RPC 调用它。此外,如果您有一小部分数据(<1000),您可以预加载页面 html 的所有实体 ID。

于 2012-06-12T02:47:57.227 回答