我正在开发一个Android应用程序,我需要在我的Firestore数据库上进行复杂的查询并创建一个FirestoreRecyclerAdapter
。要创建adpater,我需要一个FirestoreRecyclerOptions
对象来输入整个查询。阅读文档,我不能在我的查询中使用不同参数的方法whereGreaterThan
,whereLessThan
,oderBy
等。例如,如何从db中获得年龄大于/小于AND且权重大于/小于?的用户?
例如,我的firestore数据库中的文档结构是:
Users --->UserID--->userName(String)
--->userAge(number)
--->userHeight(number)
--->userWeight(number)
FirebaseFirestore db;
db = FirebaseFirestore.getInstance();
RecyclerView recyclerView;
recyclerView = (RecyclerView)findViewById(R.id.recyclerViewID);
.
.
.
Query query = db.collection("Users").//the complex query that i need
FirestoreRecyclerOptions<User> options = new FirestoreRecyclerOptions.Builder<User>()
.setQuery(query, User.class)
.build();
adapter = new UsersAdapter(options, this);//get in input options and the context
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
编辑:我在上一条评论中回答1的可能解决方案
对于Firestore,有一些query limitations:
Query limitations
Cloud Firestore不支持以下类型的查询:
- 使用不同字段上的范围过滤器进行查询,如上一节中所述。
因此,您无法在不同属性上使用whereGreaterThan()
和whereLessThan()
方法在范围过滤器上查询数据库,并将其传递给适配器。
编辑:
此问题的可能解决方案是过滤您的记录客户端两次。首先使用第一个属性查询数据库,然后使用第二个属性查询数据库。不幸的是,你无法一次性实现这一目标。
Aaditi:
解决方案是使用第一个查询查询数据库,获取相应的元素,使用第二个查询再次查询数据库并获取相应的元素,然后合并客户端的结果。现在,数据库中的元素被过滤了两次。将这些元素的列表传递给适配器,就是这样。请注意,使用此解决方案时,您无法再使用Firebase-UI库,但这样可以将您的项目过滤两次。