我正在尝试新的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);
答案 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)
过滤器区分大小写,在留言板示例中:
cq.setFilter(F.eq("MESSAGE","fabulous"));
- >这不起作用......不要让Google Cloud Console欺骗你。cq.setFilter(F.eq("message","fabulous"));
- >这将有效...不知道为什么区分大小写。如果这是问题,请告诉我。
答案 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
可能会有用