如何在 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:{
...
},
...
},
...
}
这样做,我可以用一个听众收听所有地点
我目前正在尝试开发一款应用程序,用户可以使用该应用程序跟踪他们的位置。重要的是,其他用户不得看到不在组中的其他人的位置。
为了听取组中所有用户的位置更新,我一直在徘徊,如果将 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:{
...
},
...
},
...
}
这样做,我可以用一个听众收听所有地点