java - Firebase 数据库中的 setValue() 方法不起作用。值没有添加到数据库中

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

我一直在开发社交媒体应用程序。我不知道到底是什么原因造成的,但突然间我的“点赞”按钮停止运行,因为该值没有添加到我的数据库中。

此外,我想补充一点,当我在显示单个帖子的 PostDetailActivity 中使用相同的“like”代码时,“like”按钮工作得很好。但是当我在 MainActivity 的一个 fragment 中使用它时,就遇到了问题。

这是我添加类似内容的代码:

代码来 self 的PostAdapter

databaseReferenceLikes = FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostid());

        holder.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.like.getTag().equals("like")) {

                    databaseReferenceLikes.runTransaction(new Transaction.Handler() {
                        @NonNull
                        @Override
                        public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                            mutableData.child(firebaseUser.getUid()).setValue(true);
                            return Transaction.success(mutableData);
                        }

                        @Override
                        public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                            if (b)
                                addNotification(post.getPublisher(), post.getPostid());

                            if (databaseError != null)
                                databaseError.toException().printStackTrace();
                        }
                    });

                } else {

                    databaseReferenceLikes.runTransaction(new Transaction.Handler() {
                        @NonNull
                        @Override
                        public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                            mutableData.child(firebaseUser.getUid()).setValue(null);
                            return Transaction.success(mutableData);
                        }

                        @Override
                        public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                            if (b)
                                removeNotification(post.getPublisher(), post.getPostid());

                            if (databaseError != null)
                                databaseError.toException().printStackTrace();
                        }
                    });

                }
            }
        });

除了提要上的最后一个帖子运行良好之外,其他所有帖子都无法被点赞。我尝试删除 mLayoutManager.setStackFromEnd() 方法,发现现在第一篇文章的按钮功能类似,而其余的则没有。由于 fragment 内和 PostDetailActivity 内的第一个或最后一个帖子的点赞数已添加,因此很明显 doTransaction 方法正在执行,但 setValue 方法不会将值添加到数据库。

RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(false);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);

谁能解释一下这是什么原因吗?

最佳答案

我没有使用引用变量databaseReferenceLikes,而是使用火车残骸代码作为该引用,它对我有用。

holder.like.setOnClickListener(view -> {
            if (holder.like.getTag().equals("like")) {
                FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostid()).runTransaction(new Transaction.Handler() {
                    @NonNull
                    @Override
                    public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                        mutableData.child(firebaseUser.getUid()).setValue(true);
                        return Transaction.success(mutableData);
                    }

                    @Override
                    public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                        if (dataSnapshot != null) // No error has occurred
                            if (dataSnapshot.hasChild(firebaseUser.getUid())) // Data is present at the location databaseReferenceLikes
                                if (b) { // Transaction was successfully completed
                                    addNotification(post.getPublisher(), post.getPostid());
                                }

                        if (databaseError != null)
                            databaseError.toException().printStackTrace();
                    }
                });
            } else {
                FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostid()).runTransaction(new Transaction.Handler() {
                    @NonNull
                    @Override
                    public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                        mutableData.child(firebaseUser.getUid()).setValue(null);
                        return Transaction.success(mutableData);
                    }

                    @Override
                    public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                        if (dataSnapshot != null) // No error has occurred
                            if (!dataSnapshot.hasChild(firebaseUser.getUid())) // Confirm that data is removed from location databaseReferenceLikes
                                if (b) // Transaction was successfully completed
                                    removeNotification(post.getPublisher(), post.getPostid());

                        if (databaseError != null)
                            databaseError.toException().printStackTrace();
                    }
                });
            }
        });

问题是数据没有注册到数据库中。嗯,现在可以了。问题解决了。

关于java - Firebase 数据库中的 setValue() 方法不起作用。值没有添加到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59403598/

相关文章:

java - NoSuchBeanDefinitionException : No unique bean of type is define. 当两个相同类型的 beans

java - ffmpeg 在 android 上的视频 http

android - 将网址加载到Webview后,如何在后台播放音频?

android - GridView 请停止滚动...请适合父布局

ios - 如何检索存储在 firebase 中的图像以在 View ImageView 中显示它

firebase - Firebase FCM 是否支持检索旧消息?

java - reduce 操作中并行流的同步问题

java - 如何在不知道名称的情况下获取 JSONObject 中的第一个对象?

android - 使用 VrVideoView (Google VR SDK) 在 YouTube 上加载 360 度视频?

firebase - 在 Mac 上哪里可以找到 .firebaserc 文件?