有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Firebase中聆听多个孩子的声音?

我目前正在尝试开发一款应用程序,用户可以用它追踪自己的位置。重要的是,其他用户不得看到不在群中的其他用户的位置

为了监听组中所有用户的位置更新,我想知道在每个位置上附加一个ChildEventListener是否是最有效的方法。在参考资料中添加这么多听众,感觉有点奇怪。(我考虑将uid存储在一个列表中,并将侦听器应用于带有uid的位置子对象)。据我所知,出于安全原因,我无法将侦听器设置为父对象

还有更好的方法吗?还是这条路

{
    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);
        }

共 (1) 个答案

  1. # 1 楼答案

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

    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所属的组,现在您可以使用下面的方法从该组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) {
    
        }
    });