В моем проекте Android мне нужно, чтобы Firebase загружал / извлекал мой список 'children' (user with name) при извлечении объекта (группы), который находится в отношении "многие ко многим", как в приведенной ниже структуре:
App {
"users" : {
"user123jsbgkjwroi" : {
"name" : "Mr Guy",
"groups" : {
"group567-alkfhhiuall_dajk" : true,
...
}
}
}
"groups" : {
"group567-alkfhhiuall_dajk" : {
"name" : "My Group 1",
"groupShortCode" : "567",
"groupPassPhrase" : "ABC",
"members" : {
"user123jsbgkjwroi" : {
"A": 2,
"B": 1,
"C": 33
},
...
}
}
}
}
Я, вероятно, сделал мою жизнь сложнее, чем нужно, потому что я новичок в NoSQL, мой объект группы использует пользователя в качестве ключа карты, по сравнению с другим объектом, который содержит список (A, B, C),Примерно так:
class Group {
private String name;
private Map<User, GroupItems> members;
}
Когда новый пользователь присоединяется к группе, введя groupShortCode и groupPassPhrase, мне нужно загрузить весь объект Group вместе с другими пользователями (членами) группы.
Но я не хочу делать это рекурсивно (я бы предпочел получить как можно меньше документов - я не должен загружать другие группы пользователя).Вот что я попробовал:
dbReference.child("groups").orderByChild("groupShortCode").equalTo(...)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<User> users = new ArrayList<>();
//TODO: Here I need load each User, but it means tons of calls
Iterable<DataSnapshot> profileKeys = dataSnapshot.child("members").getChildren();
for (DataSnapshot keySnapshot : profileKeys) {
dbReference.child("users").child(keySnapshot.getKey())
.addListenerForSingleValueEvent( ... );
}
//this constructor is because of the Object-to-Object Map so dataSnapshot.getValue() fails
Group group = new Group(dataSnapshot, users);
...
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
...
}
});
Как мне сделать это правильно, эффективно!?