Android Backend Starter setFilter

时间:2013-06-17 07:24:52

标签: android backend

我正在尝试新的Android移动后端。我做了所有的基本样本,现在我想设置一个或多个过滤器。我只尝试了一个,但getCloudBackend()。列表返回一个空列表。

我在实体中使用值过滤参数。如果我删除了我过滤的行,该服务将返回一个包含数据的列表。

如果我想通过一个参数过滤,我该怎么办?如果我想由所有者过滤?如果我想放置多个过滤器?

这是我的代码:

getCloudBackend().clearAllSubscription();
CloudQuery cq = new CloudQuery("MyEntity");
cq.setSort(CloudEntity.PROP_UPDATED_AT, Order.DESC);
cq.setLimit(100);
q.setFilter(F.eq("myparameter", "myvalue"));
cq.setScope(Scope.FUTURE_AND_PAST);
getCloudBackend().list(cq, handler);

3 个答案:

答案 0 :(得分:1)

您应该在LogCat和后端日志中发布错误(或响应)。过滤器有点棘手。我建议您查看CloudQuery文档以查看过滤器限制,并CloudEntity检查您可以发送,检索和使用的数据。

关于查询文档说:

  

Cloud Backend API中的查询有一些限制   来自App Engine数据存储区。默认情况下,App Engine会自动执行   为每个用户定义的属性创建一个索引(除了   列表/地图属性)。该索引支持以下形式   查询: - 指定的种类名称,没有过滤器,没有排序 - 查询   只有在没有排序的索引属性上的相等过滤器(F.eq) -   只有不等式过滤器的查询,例如F.lt,F.ge,单个   indexed属性 - 在一个属性上具有一个排序顺序的查询,但没有   过滤

例如,对于String属性,您只能检查相等性(eq / ne)。您不能将等于过滤器与不等等过滤器混合使用。即:

F.and(F.eq(PROPERTY_NAME, "Manuel"), F.gt(PROPERTY_AGE, Integer.valueOf(18)));

会给您一个错误DatastoreNeedIndexException

文档还说:

  

所有其他查询表单都会引发一个DatastoreNeedIndexException   后端。要使用更复杂的查询形式,您需要添加一个   Index Configuration在后端。

要执行此操作,您需要在后端编辑datastore-indexes.xml。为此,您可以使用命令./appengine-java-sdk/bin/appcfg.sh update_indexes myapp/war

虽然我还没有测试过但看起来很有希望......

答案 1 :(得分:0)

过滤器区分大小写,在留言板示例中:

  1. cq.setFilter(F.eq("MESSAGE","fabulous")); - >这不起作用......不要让Google Cloud Console欺骗你。
  2. cq.setFilter(F.eq("message","fabulous")); - >这将有效...不知道为什么区分大小写。
  3. 如果这是问题,请告诉我。

答案 2 :(得分:0)

  

如果我想用一个参数过滤,我该怎么做?

我认为最好使用getCloudBackend().listByProperty()方法而不是getCloudBackend().list()

此方法用法示例:

getCloudBackend().listByProperty("yourKindName", "yourPropertyName", Op.EQ,
yourPropertyValueObject, null, 1, Scope.PAST, yourHandler);
  

如果我想由所有者过滤?

您可以使用上面列出的方法。只需输入您的所有者属性名称,而不是yourPropertyName

  

如果我想放置多个过滤器?

要对一个属性使用多个过滤器,我在listByPropertyAnd()类中创建了CloudBackendAsync方法:

    public void listByPropertyAnd(String kindName, String propertyName,
            CloudQuery.Order order, int limit, Scope scope,
            CloudCallbackHandler<List<CloudEntity>> handler, F... filters) {

        CloudQuery cq = new CloudQuery(kindName);
        cq.setFilter(F.and(filters));
        cq.setSort(propertyName, order);
        cq.setLimit(limit);
        cq.setScope(scope);
        this.list(cq, handler);
    }

此方法用法示例:

getCloudBackend().listByPropertyAnd("yourKindName", "yourKindName", Order.DESC,
                1000, Scope.FUTURE_AND_PAST, yourHandler,
                F.gt("yourKindName", yourFirstValue),
                F.lt("yourKindName", yourSecondValue), F.eq("date", mToday));

在这种情况下,您可以为一个属性使用任意数量的过滤器,但它应符合datastore indexing规则。 另外,阅读此Java Datastore Filters和此Mobile Backend Starter - API Guide

可能会有用