【问题标题】:Reading actual Firebase records based on their ids根据 id 读取实际 Firebase 记录
【发布时间】:2018-09-10 05:27:36
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 所以是的,这就是我所说的:我应该为每个 post 节点附加一个侦听器,除了在您的示例中这是一个单值事件侦听器,所以我想这一定比更有效不断监听每个 post 节点上的事件。感谢您的确认和澄清!
    猜你喜欢
    • 2014-05-19
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多