根据ID显示实际的Firebase记录

时间:2018-03-31 10:41:38

标签: java android firebase firebase-realtime-database flatten

假设我有一个Firebase实时数据库结构,其中有用户节点,每个用户节点都有仅包含post id的post节点。然后还有实际帖子所在的单独的帖子节点(平面数据结构)。该结构在 this answer 中详细介绍。

现在,如果我可以通过将监听器附加到该用户的帖子节点来获取每个用户的帖子的ID,那么如何自己检索帖子(来自帖子节点的完整信息)?我知道没有任何查询可以传递一堆密钥并获取相关记录。我应该只为我感兴趣的每个帖子节点附加一个监听器吗?我目前担心会出现一些严重的性能问题,因为帖子的数量实际上是无限的。

1 个答案:

答案 0 :(得分:1)

使用此 post 中的确切数据库结构来解决您的问题,您需要两次查询数据库。一旦获得您需要的特定用户的帖子ID,然后获得自己的帖子。为此,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("users").child(uid).child("posts");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String postId = ds.getKey();

            DatabaseReference postIdRef = rootRef.child("posts").child(postId);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                        String postName = dSnapshot.child("postName").getValue(String.class);
                        Log.d("TAG", postName);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            postIdRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
postsRef.addListenerForSingleValueEvent(valueEventListener);