Datasnapshot无法从Firebase返回正确的数据

时间:2019-12-24 13:45:52

标签: java android firebase firebase-realtime-database

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

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

下面是指向我的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();
    }

1 个答案:

答案 0 :(得分:0)

不确定是否有人真的需要此信息,但是在与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) {

            }
        });
    }