Android 需要重新构造JSON数据库或进行单个查询(Firebase)
我的JSON树中有两个分支,如下所示:Android 需要重新构造JSON数据库或进行单个查询(Firebase),android,json,firebase,firebase-realtime-database,Android,Json,Firebase,Firebase Realtime Database,我的JSON树中有两个分支,如下所示: users { profile-data { user-key { //here is users profile fields like nickname and other } ...... } friends { user-key { friend's-user-key:true
users {
profile-data {
user-key {
//here is users profile fields like nickname and other
}
......
}
friends {
user-key {
friend's-user-key:true
another-friend's-user-key:true
......
}
}
}
usersFriendsRef.child("userId").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String userId = child.getKey();
usersProfileDataRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
////Only here i can get user's profile data
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
databaseReference.removeEventListener(valueEventListener);
问题是获取用户的所有用户配置文件数据,这些用户是任何用户的朋友。我没有找到通过一个查询获取所有这些数据的方法,因此我需要编写如下内容:
users {
profile-data {
user-key {
//here is users profile fields like nickname and other
}
......
}
friends {
user-key {
friend's-user-key:true
another-friend's-user-key:true
......
}
}
}
usersFriendsRef.child("userId").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String userId = child.getKey();
usersProfileDataRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
////Only here i can get user's profile data
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
databaseReference.removeEventListener(valueEventListener);
所以问题是,我需要发出许多请求来逐个获取朋友的个人资料数据,所以我需要重新构建我的数据库,或者找到将其编写为一个查询的方法,这是实现这一点的正确方法。嵌套查询没有问题。您需要找到所有这些id,然后根据它们进行查询。我可以移动
profile data->user key
下的friends
节点来创建一个查询,但我知道在Firebase中,最好将数据尽可能扁平化,这不是一个解决方案
请记住,当不再需要侦听器时,不要忘记将其删除,如下所示:
users {
profile-data {
user-key {
//here is users profile fields like nickname and other
}
......
}
friends {
user-key {
friend's-user-key:true
another-friend's-user-key:true
......
}
}
}
usersFriendsRef.child("userId").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String userId = child.getKey();
usersProfileDataRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
////Only here i can get user's profile data
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
databaseReference.removeEventListener(valueEventListener);
希望有帮助。这是实现这一目标的正确方法。嵌套查询没有问题。您需要找到所有这些id,然后根据它们进行查询。我可以移动
profile data->user key
下的friends
节点来创建一个查询,但我知道在Firebase中,最好将数据尽可能扁平化,这不是一个解决方案
请记住,当不再需要侦听器时,不要忘记将其删除,如下所示:
users {
profile-data {
user-key {
//here is users profile fields like nickname and other
}
......
}
friends {
user-key {
friend's-user-key:true
another-friend's-user-key:true
......
}
}
}
usersFriendsRef.child("userId").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String userId = child.getKey();
usersProfileDataRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
////Only here i can get user's profile data
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
databaseReference.removeEventListener(valueEventListener);
希望能有帮助