在Firebase中,应用扁平化数据结构的原则时解释了here。
如果我在他们的例子中使用了结构:
// Chats contains only meta info about each conversation
// stored under the chats's unique ID
"chats": {
"one": {
"title": "Historical Tech Pioneers",
"lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
"timestamp": 1459361875666
},
"two": { ... },
"three": { ... }
},
// Conversation members are easily accessible
// and stored by chat conversation ID
"members": {
// we'll talk about indices like this below
"one": {
"ghopper": true,
"alovelace": true,
"eclarke": true
},
"two": { ... },
"three": { ... }
},
"users": {
"ghopper": {
"name": "user_name",
"age": 28
},
"alovelace": { ... },
"eclarke": { ... }
}
}
让我们说我想要显示频道one
的成员列表及其所有详细信息。这意味着我必须首先检索位置members/one
处的所有子项,然后逐个查询每个用户ID。
这意味着如果我想在回收站视图中显示它们,检索数据是异步的,用户体验可能不是最好的:
在我的情况下,这将是一个类似的实现:
@Override
public void onBindViewHolder(final UserViewHolder viewHolder, int position) {
//getKey(position) just retrieve the key of current member in my adapter array
FirebaseDatabase.getInstance().getReference("users").child(getKey(position)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
viewHolder.setName(user.getName());
viewHolder.setPersonAge(user.getAge());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
这不太理想,但我看不到另一种方法。在启动活动之前加载每个成员会引入一个问题,即知道何时从数据库中检索了所有用户配置文件。
欢迎任何建议。