如何使用 Cloud Firestore 查询用户待处理的好友请求?

Posted

技术标签:

【中文标题】如何使用 Cloud Firestore 查询用户待处理的好友请求?【英文标题】:How can I query an user's pending friend requests using Cloud Firestore? 【发布时间】:2021-07-24 17:03:10 【问题描述】:

我目前无法使用 FirestoreRecyclerAdapter 在 RecyclerView 中显示用户待处理的好友请求。

这就是我的数据的结构:

    Users collection, which stores details about the user (name, profile image, status) Requests collection, in which I store two array lists of user ID's, one for pending requests and another for received requests

我想查询这样的内容,获取在数组中找到 userId 的所有用户文档。

    CollectionReference usersRef = db.collection("users");
    Query query = usersRef.whereIn("userId", requestsArray);
    FirestoreRecyclerOptions<User> options = new FirestoreRecyclerOptions.Builder<User>()
            .setQuery(query, User.class)
            .build();

这就是我从数据库中获取用户 ID 数组的方式

 currentUser = firebaseAuth.getInstance().getCurrentUser();
    DocumentReference requestsRef = db.collection("friend requests").document(currentUser.getUid());
    requestsRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() 
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) 
            if(task.isSuccessful())
                DocumentSnapshot documentSnapshot = task.getResult();
                Requests request = documentSnapshot.toObject(Requests.class);
                requestsArray = request.getReceivedRequests();
            
        
    );

在尝试查询用户集合并填充 RecyclerView 之前,我正在努力弄清楚如何确保 requests.get() 已完成并且数组不为空,因为我收到以下错误“java.lang.IllegalArgumentException:无效查询。'in'过滤器需要一个非空数组。”。

我不得不提一下,我对 Firebase 还很陌生,并且仍在学习它是如何工作的。非常感谢任何建议/帮助!

【问题讨论】:

【参考方案1】:

我正在努力解决如何确保 requests.get() 已经完成

当“onComplete()”方法触发时,您将始终 100% 确定“requestsRef.get()”已完成从数据库加载数据。这意味着可以读取“requestsRef”位置的所有数据,没有安全规则拒绝读取操作,现在所有数据都可用于任何其他操作。因此,例如,您总是需要等待数据可用才能在另一个查询中使用。

并且在尝试查询用户集合并填充 RecyclerView 之前数组不为空

要解决这个问题,您可以考虑实例化“Requests”类中存在的“receivedRequests”和“sentRequests”这两个数组。这样,当数组中不存在 ID 时,您将得到一个空数组并且 not “null”。如果你不想这样做,你也可以检查无效性。

但是,出现以下错误:

java.lang.IllegalArgumentException: Invalid Query. A non-empty array is required for 'in' filters.

发生是因为当您将“requestsArray”对象发送到“whereIn()”方法时,尚未完成从数据库加载数据。因此,任何需要来自 Firestore 的数据的代码都需要在“onComplete()”方法中,或者从那里调用。因此,在这种情况下,最简单的解决方案是移动以下代码行:

CollectionReference usersRef = db.collection("users");
Query query = usersRef.whereIn("userId", requestsArray);
FirestoreRecyclerOptions<User> options = new FirestoreRecyclerOptions.Builder<User>()
        .setQuery(query, User.class)
        .build()

就在“onComplete()”方法内部,在以下代码行之后:

requestsArray = request.getReceivedRequests();

通过这种方式,您将确定永远不会确定空数组。在最坏的情况下,您将使用一个空数组,但不会使用未使用的数组。

【讨论】:

非常感谢您对我的帮助!我完全按照你的建议做了,它奏效了。我只需要添加一个事件监听器,这样我就可以在接受/拒绝请求时刷新查询和回收视图

以上是关于如何使用 Cloud Firestore 查询用户待处理的好友请求?的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore:如何在我的集合查询中获取文档引用并将其映射为 JSON 值?

如何在 Cloud Firestore 中使用文档 ID 执行集合组查询

Android Cloud Firestore:查询以查找用户名

使用规则禁用 Firebase Cloud Firestore 中的查询集合

是否可以在Cloud Firestore中查询多个文档子集合? [重复]

查询时如何在 Flutter (Dart) 中使用变量 Cloud Firestore