【问题标题】:How to get inner child values Firebase?如何获取内部子值 Firebase?
【发布时间】:2020-09-09 13:20:03
【问题描述】:

我试图通过将节点与我的字符串数组进行比较来检索内部子值。我在 Firebase 中有以下数据库结构。

结构:

-Posts
    -uid1
        -postid1
            -postid1:
            -title:
            -description:
        -postid2
            -postid2:
            -title:
            -description:
    -uid2
        -postid1
            -postid1:
            -title:
            -description:

我想通过比较给定字符串数组中的 uid 来获取所有 postid 的数据。如何从 uid > postid > postid,title,description 中获取每个节点的 postid、title、description?

以下是我想与 Firebase uids 比较的 ID,以仅获取这些帖子的数据。

String uids[]={"uid1","uid2"};

如何在 Android Java 代码中编写解决方案?

我写过这样的东西。

final String uids[]={"id1","id2"};
        DatabaseReference reference=FirebaseDatabase.getInstance().getReference().child("Posts");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren())
                {
                    for(int i=0;i< uids.length;i++)
                        if(uids[i].equals(ds.getKey()))
                        {
                            // stuck in here
                        }
                }
            }
            public void onCancelled(@NonNull DatabaseError databaseError) {}
        });

我被 UIDis 匹配的代码卡住了。如何获取内部 postid 数据?

【问题讨论】:

  • 你能告诉我们你目前有什么代码吗?看看你尝试过的东西可能会很好地指导他们的答案。
  • 是的,请查看更新后的答案。我无法编写代码来获取 postid 数据。请帮我完成代码。谢谢

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


【解决方案1】:

您可以使用递归方法解决此问题。首先,您需要将该数组转换为这样的列表:

String[] uids = {"uid1", "uid2"};
List<String> uidList = Arrays.asList(uids);

uidList 设为全局变量:

private List<String> uidList;

并将上面的行改为:

uidList = Arrays.asList(uids);

现在,定义一个引用:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("Posts");

并创建一个新的Post 对象列表:

List<Post> posts = new ArrayList<>();

下面是施展魔法的方法:

public void getAllUserPosts() {
    if (uidList.size() > 0) {
        String uid = uidList.get(0);
        uidList.remove(0);
        postsRef.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    Post post = ds.getValue(Post.class);
                    posts.add(post);
                }
                getAllUserPosts();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }
        });
    }
}

最后,只需调用这个方法:

getAllUserPosts();

结果将是一个完整的列表,其中包含所有用户的所有 Post 对象。

【讨论】:

  • 困难的解决方案。我无法理解。请让它更简单
  • 你有什么不明白的?再简单不过了。
  • 我去看看,如果我知道答案,我会写信给你。
  • @KassandraJones “支持我的问题 = 我会接受你的回答”这不是交易。如果您认为我的回答对您有所帮助,您应该考虑接受它。如果我觉得你的问题很有趣,我会投票赞成。但我不会只为你的问题投票,所以你接受我的回答。
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 2018-04-16
  • 2017-09-03
  • 2018-10-15
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多