使用Firebase实时数据库进行事务处理

时间:2018-10-24 23:25:04

标签: java android firebase firebase-realtime-database

我正在尝试进行交易以发表喜欢的帖子,我想归档的是,当我单击“喜欢”按钮时,它将添加到节点1赞中的当前喜欢,我想进行交易,因为当多个赞被发送到同一节点时,这是不丢失数据的最佳方法。

这是我尝试过的

 private void addUpNewLike() {

        final DatabaseReference ref = mDatabase.child("post").child("likes");

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                ref.runTransaction(new Transaction.Handler() {
                    @NonNull
                    @Override
                    public Transaction.Result doTransaction(@NonNull MutableData mutableData) {

                           int currentLikes = mutableData.getValue(Integer.class);

                           if(mutableData.getValue()==null){
                               return Transaction.success(mutableData);
                           }

                           final int updatedLikes = currentLikes + 1;

                            ref.setValue(updatedLikes).addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    actualLikeFirebase.setText(String.valueOf(updatedLikes));
                                }
                            });

                        return Transaction.success(mutableData);
                    }

                    @Override
                    public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                        Log.e(TAG, "onComplete: "+databaseError.getMessage() );

                    }
                });
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.e(TAG, "onCancelled: "+databaseError.getDetails());

            }
        });

    }

所以,我的目标是首先获取该节点下的数据,然后获取数据并将当前数据加1并将其发布到Firebase,因此,如果100个用户同时喜欢一个帖子我可以进行此交易,以免失去任何喜欢的人。

我遇到的问题是2

1 .- 我刚刚检查了一些答案,发现我第一次运行事务时会观察并处理空值,因此我尝试在此行修复此问题,因为我没有当我第一次运行该应用程序时,具有相同的值。

 if(mutableData.getValue()==null){
                                   return Transaction.success(mutableData);
                               }

我收到了这个错误

  

java.lang.NullPointerException:尝试调用虚拟方法'int   空对象引用上的java.lang.Integer.intValue()'

2 .- 现在,如果我在RealtimeDatabase中对数据库结构进行调试,则按按钮,但是将值发布到节点中需要花费一些时间,并且它会发布巨大的值。值,如果我按5次,它将在排队5时发布30或40个赞。

数据库结构

enter image description here

0 个答案:

没有答案