查询混合过滤器StContainsFilter和FilterPredicate的数据数据存储区

时间:2016-12-13 16:49:01

标签: java android google-cloud-datastore

抱歉我的英文。

我正在开发一个在Datastore Google云上存储数据的Android应用程序。我想对我的数据存储区执行一个混合StContainsFilterFilterPredicate的查询。这是行不通的!这是我的代码:

DatastoreService service = DatastoreServiceFactory.getDatastoreService();
Query q = new Query("utilisateurs");
Query.Filter filtrage1 = new Query.FilterPredicate("sexe", Query.FilterOperator.EQUAL, "M");

Query.Filter filtrage2 = new Query.FilterPredicate("datenaissance", Query.FilterOperator.LESS_THAN_OR_EQUAL, datemin);
Query.Filter filtrage3 = new Query.FilterPredicate("datenaissance", Query.FilterOperator.GREATER_THAN_OR_EQUAL, datemax);

GeoPt center = new GeoPt(Float.parseFloat(lat), Float.parseFloat(lng));
double radius = km*1000;
Query.Filter filtrage4 = new Query.StContainsFilter("location", new GeoRegion.Circle(center, radius));
Query.Filter present = Query.CompositeFilterOperator.and(filtrage2,filtrage3,filtrage1,filtrage4);
q.setFilter(present);
PreparedQuery pq = service.prepare(q);
List<Entity> results = pq.asList(FetchOptions.Builder.withDefaults());

1 个答案:

答案 0 :(得分:0)

要混合使用不同的过滤器,您可以使用CompositeFilter。您可以阅读有关数据存储区查询here的更多信息。使用CompositeFilter,您可以连接多个过滤器,然后将其作为一个过滤器。但是,您仍然必须考虑不要在多个属性上设置不等式过滤器。

要创建CompositeFilter,请使用以下语法:

status

Collection也可以是List,Array或者您可以用逗号分隔过滤器

这里有一个关于如何创建CompositeFilter的示例:

CompositeFilter nameOfFilter = CompositeFilterOperator.and(Collection<Filter>); 

使用CompositeFilterOperator.and如果您需要应用所有过滤器,或者如果应用过滤器就足够了。

从技术上讲,您的解决方案应该可行,因为StContainsFilter是Query.Filter的直接子类。您的问题的原因是导入错误。你应该检查你的进口并改变它们,如果他们用&#34;重新包装&#34; (我也有同样的问题)