我到处寻找一种以优雅的方式实现这一目标的方法,遗憾的是无济于事。这是我的简化数据库结构的样子:
{
"bets" : {
"bet1" : {
"description" : "this is so cool",
"initiator" : "user1",
"public" : false,
"receivers" : {
"user2" : true,
"user3" : true
},
"timestamp" : "1480868494",
"title" : "Cool Bet"
}
},
"users" : {
"user1" : {
"bets_initiated" : {
"bet1" : true
},
"email" : "some_mail@gmail.com",
"friends" : {
"user2" : true,
"user3" : true
},
"score" : 0
},
"user2" : {
"bets_initiated" : {
"bet2" : true
},
"email" : "some_mail@gmail.com",
"friends" : {
"user1" : true,
"user3" : true
},
"score" : 0
},
"user3" : {
"bets_initiated" : {
"bet3" : true
},
"email" : "some_mail@gmail.com",
"friends" : {
"user2" : true,
"user1" : true
},
"score" : 0
}
}
}
这是相关的Java代码:
// get friends as a list
mDatabase.child("users").child(mCurrentUserId).child("friends").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
HashMap<String, Boolean> friendsMap = dataSnapshot.getValue(HashMap.class);
List friendsList = new ArrayList<>(friendsMap.keySet());
String friendsListAsString = TextUtils.join(", ", friendsList);
// build query using list of friends
Query friendsQuery = mDatabase.child("users").equalTo(friendsListAsString);
/**
* A {@link com.firebase.ui.database.FirebaseRecyclerAdapter} providing the interactive list of friends
*/
mFriendsListAdapter = new UserAdapter(User.class, R.layout.user_item,
UserAdapter.UserViewHolder.class, friendsQuery);
// bind click listener through helper function
mFriendsListAdapter.setOnUserClickListener(mContext);
mFriendsListView.setAdapter(mFriendsListAdapter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
所以,我基本上试图获取所有用户ID,在查询中使用它们来获取相应用户节点的所有数据(通过将其映射到模型Java类)并将其提供给适配器(I&# 39; m使用FirebaseRecyclerAdapter)。
它似乎以某种方式起作用,但我很确定这不是应该如何完成的。
我知道我可以重新构建我的数据库,这样就不会只将布尔值映射到朋友的下面的UID了。节点我将克隆相应用户的整个用户节点。
但是,在文档中,建议使用Firebase数据库的这种平面方法,因此我认为必须有一种方法可以有效地执行此操作。由于我对使用Firebase进行开发非常陌生,我可能只是没有掌握明显的解决方案,但我真的被困在这里,所以任何帮助都会受到赞赏。