在我的数据库中,每个用户都有朋友。我需要获得用户朋友的50个最后帖子。请参阅Firebase DB中每个用户的帖子结构。
那么最佳方法是什么?如果用户有例如150个朋友,那么我的Android应用应该拥有与朋友一样多的听众。在应用程序中有150个或更多数据库侦听器可以吗?还有什么方法可以在单个查询中获取所有朋友的帖子?感谢。
root
- posts
- {userUid}
- {postUid}
- text
- dateCreated
答案 0 :(得分:1)
根据您的活动生命周期,您可以根据需要使用尽可能多的侦听器来删除它们。但在你的情况下,你不需要150个听众,你只需要一个。假设用户下的节点名为friends
,您可以在friends
节点上附加单个侦听器,然后使用DataSnapshot
方法迭代getChildren()
对象。假设您的数据库看起来与此类似:
Firebase-root
|
--- users
|
--- uid1
|
--- friends
|
--- friendId1: true
|
--- friendId2: true
要获得所有与特定用户对应的朋友,请使用以下代码:
String uid = firebaseAuth.getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference friendsRef = rootRef.child("users").child(uid).child(friends);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String friendId = ds.getKey();
Log.d("TAG", friendId);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
friendsRef.addListenerForSingleValueEvent(eventListener);
要获取所有用户的所有帖子,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("posts");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String uid = ds.getKey();
DatabaseReference uidRef = postsRef.child(uid);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
String text = dSnapshot.child("text").getValue(String.class);
long dateCreated = dSnapshot.child("dateCreated").getValue(Long.class);
Log.d("TAG", text + " / " + dateCreated)
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
postsRef.addListenerForSingleValueEvent(valueEventListener);
答案 1 :(得分:0)
我要做的是拥有一个friendsListener,一旦初始化,我会遍历我的朋友并在我的听众和150个听众中注册他们的参考。
答案 2 :(得分:0)
你可以有150多个听众,但越少越好。也许你可以只看所有帖子,而不是分别听取每个朋友的意见。
要获取朋友的所有帖子一次,请尝试:
ref('posts').child(friendUid).once('value').then(function(snapshot) {
console.log(snapshot.val());
});
要获得朋友的最后50个帖子一次,请尝试:
ref('posts').child(friendUid).orderByChild("dateCreated").limitToLast(50).once('value').then(function(snapshot) {
console.log(snapshot.val());
});
(取决于你的dateCreated属性,你可能需要使用limitToFirst而不是limitToLast。查看Firebase Query文档以获取更多信息。)