在Firebase中获取用户朋友最后帖子的最佳方式

时间:2017-12-05 15:14:47

标签: android firebase firebase-realtime-database

在我的数据库中,每个用户都有朋友。我需要获得用户朋友的50个最后帖子。请参阅Firebase DB中每个用户的帖子结构。

那么最佳方法是什么?如果用户有例如150个朋友,那么我的Android应用应该拥有与朋友一样多的听众。在应用程序中有150个或更多数据库侦听器可以吗?还有什么方法可以在单个查询中获取所有朋友的帖子?感谢。

root
- posts
  - {userUid}
    - {postUid}
      - text
      - dateCreated

3 个答案:

答案 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文档以获取更多信息。)