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

时间:2018-07-10 08:49:48

标签: java android firebase real-time-data

我目前正在尝试开发一个用户可以用来跟踪其位置的应用。重要的是其他用户不得看到其他人不在组中的位置。

为了侦听组中所有用户的位置更新,我想知道是否将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);
        }

3 个答案:

答案 0 :(得分:0)

您不应该在所有孩子上使用childEventListener。相反,应该在其父级上使用childEventListener

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

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

答案 1 :(得分:0)

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

procedure TControl.DoAddObject(const AObject: TFmxObject);
begin
  ...
  if AObject is TControl then
    For i := 1 to FUpdating do
      TControl(AObject).BeginUpdate;
  ...
end;

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

为此,数据库结构应类似于-

procedure TControl.DoRemoveObject(const AObject: TFmxObject);
begin
  ....
  if AObject is TControl then
    For i := 1 to FUpdating do
      TControl(AObject).EndUpdate;
  ....
end;

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

Group A - User 1 
        - User 2

Group B - User 3
        - User 4

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

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
        },
        ...
}

答案 2 :(得分:0)

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

<input type="checkbox" id="chkPrint" name="Print" value="false" onclick="myFunction()" onchange="yourFunction()">

这样做,我可以用一个监听器收听所有位置