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

Posted

技术标签:

【中文标题】Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中【英文标题】:setValue() method in Firebase Database not working. Value is not getting added to the database 【发布时间】:2020-04-11 16:32:38 【问题描述】:

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

另外,我想补充一点,当我在显示单个帖子的 PostDetailActivity 中使用相同的类似代码时,类似按钮可以正常工作。但是当我在 MainActivity 的一个片段中使用它时,就遇到了问题。

这是我添加类似的代码:

代码来自我的 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();
                        
                    );

                
            
        );

除了 Feed 上的最后一个帖子运行良好之外,其他所有帖子都不能被点赞。我试过删除 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);

谁能解释一下是什么原因造成的?

【问题讨论】:

解决方案在您的问题陈述中。问题出在您的适配器中,很可能在“holder.like.getTag().equals("like")”部分。由于您使用的是 recyclerview,请确保您正确设置/重置这些标签。顺便说一句,如果你正在处理like按钮,那么“if”检查有什么用? 当帖子还没有被点赞时,设置标签“点赞”。已被点赞的帖子带有“点赞”标签。这就是我区分该用户的喜欢和不喜欢的帖子并分别删除或添加喜欢的方式。 点赞后你在哪里设置标签? 可以分享你的适配器代码吗? 【参考方案1】:

我没有使用引用变量 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();
                    
                );
            
        );

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

【讨论】:

以上是关于Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中将数据添加到 Firebase 而不是 SetValue

Firebase 聊天应用 setValue 在公共数据库中失败?

setValue() 的完成导致 Firebase 崩溃,Swift 3

如何修复“java.lang.NoSuchMethodError:com.google.firebase.database.DatabaseReference.setValue”

setValue和push方法之间的区别[重复]

Firebase 实时数据库中的增量操作如何工作?