【问题标题】:Multiple Query and Ref Firebase Database Android多查询和参考 Firebase 数据库 Android
【发布时间】:2018-10-31 00:29:29
【问题描述】:

我的 firebase 数据库如下所示:

来自这个查询

String currentUserID = FirebaseAuth
                            .getInstace()
                            .getCurrentUser()
                            .getUid();

DatabaseReference favorsRef = FirebaseDatabase
                                        .getInstance()
                                        .getReference()
                                        .child("favors");
Query myChatsQuery = favorsRef
                        .orderByChild("uid")
                        .equalTo(currentUserID);

我需要创建其他查询以仅从 myChatsQuery 中获取名为“消息”的孩子的元组。如果元组没有子“消息”,我不想将它插入到我的新查询中。

那么,我如何从其他查询创建查询?

请帮帮我,

提前致谢。

【问题讨论】:

  • 如果我没听错的话,您想检查一下uids 中的哪一个有孩子叫的消息,如果他们有您想对它做点什么,对吧?
  • @PradyumanDixit 完全正确。首先,我检查有利于那些拥有我想要的 uid(等于 currentUserID)的孩子,因为并非所有孩子都具有相同的 uid。然后我需要在所有拥有 uid=currentUserID 的孩子之间检查哪些孩子有一个名为 messages 的孩子来处理这些事情。

标签: java android firebase firebase-realtime-database


【解决方案1】:

很遗憾,orderByChild() 不能同时处理多个相同的字段,因此您可能需要分两步完成这项工作。

首先,您可以运行 orderByChild() 查询以查找 currentUserId,然后将所有匹配的内容添加到 ArrayList,然后在找到的 uids 中运行 orderByChild() 以获得 messages

这看起来像这样,在代码中:

reference.orderByChild("uid").equalTo(currentUserId).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            if(dataSnapshot.exists())
                              array.add(dataSnapshot.getValue(String.class);
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                  )};

上面的这段代码将匹配currentUserIduids添加到ArrayList array

databaseReference.child(array.get(0)).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                           if(dataSnapshot.child("messages").exists())
                           // do your thing

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }

                    )};    

您也可以只使用 for 循环遍历 array 中的所有值。

【讨论】:

  • 很遗憾,此解决方案不起作用,因为您不能使用.orderByChild("messages")。 messages 不是属性,因此您可以根据它进行订购。此外,无需添加两个侦听器来验证 message 节点是否存在。
  • 实际上我需要处理生成的列表,那么如何实现第一个解决方案 w ArrayList?
  • 所以你提供的答案和我的一样,对吧?
  • @AlexMamo 是的,我认为答案几乎与您的一致,我正在删除此代码并从第一种方法中提供另一种解决方案。道歉!
  • @esterrrsinH,很高兴为您提供帮助。干杯! :)
【解决方案2】:

要解决这个问题,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("favors").orderByChild("uid").equalTo(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            if(ds.child("messages").exists()) {
                //Do what you need to do
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

如您所见,只需查询一次数据库即可解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2016-10-20
    • 2017-09-22
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多