2

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

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

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

这是我的代码:

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);
4

3 回答 3

1

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

关于查询文档说:

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

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

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

会给你一个错误DatastoreNeedIndexException

该文件还说:

所有其他查询表单将在后端引发 DatastoreNeedIndexException。要使用更复杂的查询形式,您需要在后端添加 索引配置

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

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

于 2013-08-19T09:50:50.580 回答
0

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

  1. cq.setFilter(F.eq("MESSAGE","fabulous"));-> 这行不通...不要让 Google Cloud Console 愚弄您。
  2. cq.setFilter(F.eq("message","fabulous"));-> 这会起作用...不知道为什么区分大小写。

让我知道这是否是问题所在。

于 2013-08-04T20:30:13.993 回答
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));

在这种情况下,您可以为一个属性使用任意数量的过滤器,但它应该符合 数据存储索引规则。此外,阅读此Java Datastore Filters和此Mobile Backend Starter - API Guide可能会很有用

于 2013-12-08T10:29:41.703 回答