我试图从我的Firebase数据库中将朋友ID列表拉到我的应用程序中,然后通过使用“他们的唯一ID
我的架构如下所示:
{friends
{
"Ko2D1of4KxXHzX0OqEZEAKDfw4r2" : {
"-KR0aTQGT6pfRfB5qIUz" : {
"friend_id" : "6vFVAAQfwiYERl03C3lzxdPjnEp2"
},
"-KR0aaMAOS3FWOAosBmo" : {
"friend_id" : "kxrQFVjGv0XUHyV5N764Nq50Q3J3"
}
}
}
}
第一个唯一ID是播放器的ID,可以查询其朋友列表。的子对象表示关系的ID,该对象下的friend_id显示其他玩家(朋友)的ID
用户架构如下所示:
{
"6vFVAAQfwiYERl03C3lzxdPjnEp2" : {
"emailAddress" : "b@b.com",
"level" : 1,
"userName" : "steve"
},
"Ko2D1of4KxXHzX0OqEZEAKDfw4r2" : {
"emailAddress" : "a@a.com",
"level" : 1,
"userName" : "bob"
},
"kxrQFVjGv0XUHyV5N764Nq50Q3J3" : {
"emailAddress" : "bg@b.com",
"level" : 1,
"userName" : "tim"
},
"rNtYvwF8LBhTRM1Wk8ybBJyrFIg2" : {
"emailAddress" : "c@c.com",
"level" : 1,
"userName" : "test account"
}
}
现在,在我的应用程序中,我可以成功提取所有friend_id条目,但是不确定如何使用该ID转身并提取有关该朋友的其他信息。理想情况下,我将能够通过其唯一的玩家ID来逐个查询每个朋友,并使用firebaseListAdapter填充我拥有的朋友列表片段。
这就是我提取朋友ID并填充列表对象的方式。
ValueEventListener friendListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
friendIdList.clear();
for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
String friend_id = (String) messageSnapshot.child("friend_id").getValue();
friendIdList.add(friend_id);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
mDatabase.addValueEventListener(friendListener);
有人可以帮我找出从初始查询中收到ID后将所有这些额外信息提取给朋友的最佳方法吗?
最佳答案
因此,我将连接Mathew Berg和Pastillas给出的答案。根据您的问题和意见,我认为它们结合起来可以提供您所需要的解决方案。
数据结构
您在用户位置使用的结构对我来说看起来不错,所以我可以说您可以保留原样:
{
users: {
"6vFVAAQfwiYERl03C3lzxdPjnEp2" : {
"emailAddress" : "b@b.com",
"level" : 1,
"userName" : "steve"
},
"Ko2D1of4KxXHzX0OqEZEAKDfw4r2" : {
"emailAddress" : "a@a.com",
"level" : 1,
"userName" : "bob"
}
}
}
对于您的朋友所在的位置,我同意Mathew Berg给出的结构:
{
friends : {
"Ko2D1of4KxXHzX0OqEZEAKDfw4r2" : {
"6vFVAAQfwiYERl03C3lzxdPjnEp2" : true,
"kxrQFVjGv0XUHyV5N764Nq50Q3J3" : true
}
}
}
仅供参考,您无需在此结构中使用布尔值。您可以使用任何允许的数据类型作为每个键的值。在这种情况下,键很重要,该值只是一个占位符,因为Firebase不允许键值为空。也就是说,如果您找到使用更有用的值的理由,则可以这样做。在我看来,使用布尔值可使团队成员或可能在您后面跟随的人更容易理解该结构。
检索数据
您可以通过多种方式查询朋友列表并获取每个用户的数据。既然您提到在问题中使用
FirebaseListAdapter
,我将继续讨论。如果要使用FirebaseRecyclerAdapter
,可以将相同的模式与RecyclerView
一起使用,请选择将DatabaseReference
与FirebaseUI一起使用。基本步骤是:创建一个
DatabaseReference
指向用户的位置谁的朋友列表你想要的。
创建一个指向您用户位置的
FirebaseListAdapter
创建您的
populateView
。覆盖
addListenersingleValueEvent()
时,获取每个项目的密钥使用
onDataChange
检索每个朋友的用户信息,并使用来自以下位置的数据填充您的listview行项目此查询。
在值事件侦听器的中,使用每个用户的信息来填充每个列表项的视图。
DatabaseReference mFriendsRef = FirebaseDatabase.getInstance().getReference().child("friends").child(someUserID;
DatabaseReference mUsersRef = FirebaseDatabase.getInstance().getReference().child("users");
...
mAdapter = new FirebaseListAdapter<YourModel>(this, YourModel.class, android.R.your_layout, mFriendsRef) {
@Override
protected void populateView(final View view, YourModel model, int position) {
String key = getRef(position).getKey();
mUsersRef.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//get data from dataSnapshot and bind to views for each list item
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
};
messagesView.setAdapter(mAdapter);
在使用此方法时,请检查对此问题发表的评论,以获取有关性能的担忧:Android Firebase - Denormalized Queries using FirebaseUI
关于android - 基于查询的android firebase查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39380230/