我正在尝试进行交易以发表喜欢的帖子,我想归档的是,当我单击“喜欢”按钮时,它将添加到节点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个赞。
数据库结构