如何使用FirestoreRecyclerAdapter进行复杂的查询?

时间:2019-02-15 10:14:04

标签: java android firebase google-cloud-firestore firebaseui

我正在开发一个Android应用,我需要在Firestore数据库中进行复杂的查询并创建一个FirestoreRecyclerAdapter。要创建adpater,我需要一个FirestoreRecyclerOptions对象,该对象将输入整个查询。阅读文档时,我无法在查询中使用不同参数上的方法whereGreaterThanwhereLessThanoderBy等。例如,我如何从年龄大于/小于AND且体重大于/小于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的可能解决方案

1 个答案:

答案 0 :(得分:1)

关于Firestore,有一些query limitations

  

查询限制

     

Cloud Firestore不支持以下类型的查询:

     
      
  • 如上一节所述,在不同字段上具有范围过滤器的查询。
  •   

因此,您无法在不同属性上使用whereGreaterThan()whereLessThan()方法在范围过滤器上查询数据库,并将其传递给适配器。

编辑:

此问题的可能解决方案是对记录客户端进行两次筛选。首先使用第一个属性查询数据库,然后使用第二个属性查询数据库。不幸的是,您无法一次实现。

编辑2:

解决方案是使用第一个查询查询数据库,获取对应的元素,使用第二个查询再次查询数据库,获取对应的元素,然后合并结果客户端。现在,数据库中的元素被过滤了两次。将这些元素的列表传递给适配器,仅此而已。请注意,使用此解决方案时,您将无法再使用Firebase-UI库,但这是将项目过滤两次的方法。