首页 > 解决方案 > 如何使用 FirestoreRecyclerAdapter 进行复杂查询?

问题描述

我正在开发一个 Android 应用程序,我需要对我的 Firestore 数据库进行复杂查询并创建一个FirestoreRecyclerAdapter. 要创建适配器,我需要一个FirestoreRecyclerOptions对象来输入整个查询。阅读文档后,我无法在查询中使用不同参数的方法whereGreaterThan、、whereLessThan等。oderBy例如,如何从 db 获取年龄大于/小于和体重大于/小于的用户?

例如,我的 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 的可能解决方案

标签: javaandroidfirebasegoogle-cloud-firestorefirebaseui

解决方案


Firestore存在一些查询限制:

查询限制

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

  • 如上一节所述,在不同字段上使用范围过滤器进行查询。

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

编辑:

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

编辑2:

解决方案是使用第一个查询查询数据库,获取相应的元素,使用第二个查询再次查询数据库并获取相应的元素,然后在客户端合并结果。现在来自数据库的元素被过滤了两次。将这些元素的列表传递给适配器,就是这样。请注意,在使用此解决方案时,您不能再使用 Firebase-UI 库,但是您可以通过这种方式将您的项目过滤两次。


推荐阅读