【问题标题】:Query on my data datastore that mixes a filter StContainsFilter and FilterPredicate查询混合了过滤器 StContainsFilter 和 FilterPredicate 的数据存储
【发布时间】:2016-12-13 16:49:01
【问题描述】:

对不起我的英语。

我正在开发一个将数据存储在 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());

【问题讨论】:

    标签: java android google-cloud-datastore


    【解决方案1】:

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

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

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

    集合也可以是一个列表、一个数组或者你可以用逗号分隔过滤器

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

    Filter filter1 = new FilterPredicate("someProperty", FilterOperator.Equal, someValue)
    Filter filtrage4 = new StContainsFilter("location", new GeoRegion.Circle(center, radius));
    Filter filtrage2 = new FilterPredicate("datenaissance", Query.FilterOperator.LESS_THAN_OR_EQUAL, datemin);
    
    CompositeFilter filter = CompositeFilterOperator.or(filter1, filtrage4, filtrage2);
    

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

    从技术上讲,您的解决方案应该可以工作,因为 StContainsFilter 是 Query.Filter 的直接子类。您的问题的原因是错误的导入。如果他们说“重新包装”的话,你应该检查你的导入并更改它们(我也遇到了同样的问题)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多