如何在 Firebase 中收听多个 children?

How to listen to multiple children in Firebase?

我目前正在尝试开发一款应用程序,用户可以使用该应用程序跟踪他们的位置。重要的是,其他用户不得看到不在组中的其他人的位置。

为了听取组中所有用户的位置更新,我一直在徘徊,如果将 ChildEventListener 附加到每个位置是最有效的方法。给reference加了这么多听众,感觉有点奇怪。 (我想将 uid 存储在一个列表中,并将侦听器应用到具有 uid 的 child 位置)。据我所知,出于安全原因,我无法将 Listener 设置为 parent 。

有没有更好的方法或者这是可行的方法?

{
    locations:{
        yY6qmwJLj69JGzgG:{
            "accuracy" : 23.429000854492188,
            "altitude" : 57,
            "latitude" : 3.4386667,
            "longitude" : 10.024,
            "speed" : 0,
            "time" : 1531114956000
        },
        msVYdaTy2DWcjuJ7:{
            ...
        },
        ...
    },
    groups:{
        users:{
            msVYdaTy2DWcjuJ7:true,
            yY6qmwJLj69JGzgG:true,
            ...
        },
        ...
    },
    ...
 }

我目前应用了以下规则:

{
  "rules": {
    "groups" : {
      ".read" : false,
      ".write" : false,
      "$gid" : {
        ".read" : "auth != null",
        ".write" : "auth != null"
      }
    },
    "locations" : {
      ".read" : false,
      ".write" : false,
      "$uid" : {
        ".read" : "auth != null",
        ".write" : "auth.uid === $uid"
      }
    }
  }
}

我的想法:

        for(String uid : mUserList) {
            mDatabaseReference.child("locations").child(uid).addValueEventListener(myListener);
        }

您不应该对所有 children 使用 childEventListener。相反,childEventListener 应该用在他们的 parent.

你的想法: mDatabaseReference.child("locations").child(uid).addValueEventListener(myListener);

您应该实施: mDatabaseReference.child("locations").addValueEventListener(myListener);

用户的位置只能在组内看到。例-

Group A - User 1 
        - User 2

Group B - User 3
        - User 4

用户 1 和用户 2 可以看到彼此的位置,因为他们在同一组中。但是由于不同的组,他们不允许查看用户3和4的位置。

为此,数据库结构应该像 -

groups:{
            users:{
                user1:{
                "user_id" : x
                "grp_id": 11
                "grp" : "A"
                }

                user2:{
                "user_id": y
                "grp_id" : 11
                "grp" : "A"
                }

                user3:{
                "user_id" : z
                "grp_id" : 22
                "grp" : "B"
                }

                user4:{
                "user_id" : a
                "grp_id" : 22
                "grp": "B"
                }

            }
}

locations:{
        user_id:{
            "accuracy" : 23.429000854492188,
            "altitude" : 57,
            "latitude" : 3.4386667,
            "longitude" : 10.024,
            "speed" : 0,
            "time" : 1531114956000
            "grp_id" : 11
        },
        user_id:{
            ...
            "grp_id" : 22
        },
        ...
}

假设用户 1 想要访问他的位置。他还可以访问用户 2

的位置
String grp_id;
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child(users).child(uid); // user 1 uid

reference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       for (DataSnapshot d : dataSnapshot.getChildren()) {
           grp_id = d.child("grp_id).getValue();
           fetchLocation(grp_id);

           // Here i came to know the group of user 1
       }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

您将获得用户 1 所属的组,现在您可以从中 group_id 使用下面的方法检索该特定组中所有人的位置。您也可以应用某些验证。

void fetchLocation(String grp_id) {

    DatabaseReference db = FirebaseDatabase.getInstance().getReference();

    Query query = db.child("locations").orderByChild("grp_id").equalTo(grp_id);
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

    // Here you get the locations of users of group  
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

我通过将结构保存到以下模型解决了问题

locations:{
    $groupID:{
        $userid:{
            ...
        },
        ...
    },
    ...
}

这样做,我可以用一个听众收听所有地点