【问题标题】:Datasnapshot not returning correct data from FirebaseDatasnapshot 未从 Firebase 返回正确的数据
【发布时间】:2019-12-24 13:45:52
【问题描述】:

我需要从 Firebase 检索数据,如果 user 在 ImageView 应用程序中点击“参加事件”图标,则应将其保存到他们的个人资料中。

我一直在阅读有关ValueEventListenersChildEventListeners 的信息,我认为我最好的选择是使用ValueEventListener,因为我需要postiddatasnapshot 用户已“保存”(参加) .另外,已经阅读了有关查询的信息,这似乎对我有帮助,我正在玩弄它以了解如何将其合并到我的数据中,但到目前为止还没有运气。

下面是我的 JSON 树的链接,您可以查看数据的结构。

有没有办法“跳过”一个孩子来阅读下一个孩子,因为它包含您在那个特定案例/方法中尝试使用的特定数据,并返回那个 数据,还是必须始终按顺序进行?我是否必须查询该数据才能使帖子显示在用户的个人资料中?

发布了数据库的图片链接。希望有人可以提供帮助。

Firebase

ProfileFragment.java

private void myAttendingEvent() {
        eventsImAttendingSecondButton = new ArrayList<>();

        final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event");

        Query query = reference.orderByChild(firebaseUser.getUid());

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren())
                    if (snapshot.exists()) {
                        eventsImAttendingSecondButton.add(snapshot.getKey());
                    }

                readSaves();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void readSaves() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                postList_attendingEvent.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Post post = snapshot.getValue(Post.class);

                    for (String id : eventsImAttendingSecondButton) {
                        if (post.getPostid().equals(id)) {
                            postList_attendingEvent.add(post);
                        }
                    }
                }

                Collections.reverse(postList);
                eventsImagesAdapter_attendingEvent.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

第二种方法我尝试检索postid。在我看来,这应该可行,但我没有得到任何回报。如果用户点击“参加”事件 ChildEventListener 应该读取该数据快照并将其显示在用户的个人资料中......

private void myAttendingEvent() {
        eventsImAttendingSecondButton = new ArrayList<DataSnapshot>();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event").child(postid);

        reference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    if (snapshot.equals(firebaseUser.getUid()))
                    eventsImAttendingSecondButton.add(dataSnapshot);
                }

                readSaves();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        readSaves();
    }

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • @FrankvanPuffelen 我不知道你要我做什么。您想让我在代码或其他内容下复制并粘贴我在此处询问的数据的父项和子项吗?或者你想让我以某种方式在这里获取整个 JSON 树?
  • 您是说运行此代码时数据会被删除。编辑您的问题以在运行此代码之前和之后显示(最少相关的)数据,以便我们可以看到被删除的内容。
  • 请添加 Frank van Puffelen 的要求,并回复@。
  • 这不是添加更多单词,而是将您正在阅读的 JSON 作为文本添加到您的问题中。没有它就不可能理解你的代码会做什么,而且你分享的图像也不够好。

标签: java android firebase firebase-realtime-database


【解决方案1】:

不确定是否有人真的需要这些信息,但是在玩了两天 ChildEventListener 和 ValueEventListener 之后,我发现我需要的确实是 ValueEventListener 终于实现了我的目标。希望它可以帮助某人!

我的做法是这样的:

private void myAttendingEvent() {
        eventsImAttendingSecondButton = new ArrayList<>();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    if (snapshot.hasChild(firebaseUser.getUid())){
                        eventsImAttendingSecondButton.add(snapshot.getKey());
                    }
                }

                readSaves();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 2016-12-05
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多