2016-12-13 50 views
0

對不起,我的英語。在我的數據數據存儲上查詢混合過濾器StContainsFilter和FilterPredicate

我正在研究一種將數據存儲在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()); 

回答

0

要混合不同的過濾器,您可以使用CompositeFilter。您可以閱讀有關數據存儲查詢here的更多信息。通過CompositeFilter,您可以連接多個篩選器,然後將其作爲一個篩選器。但是,您仍然必須考慮不要在多個屬性上設置不等式篩選器。

要創建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的直接子類。你的問題的原因是一個錯誤的進口。你應該檢查你的進口和改變他們,如果他們說什麼「重新包裝」(我也有同樣的問題)