编辑:2020 年 6 月 29 日
现在,不使用事务也可以解决这个问题。我们可以简单地使用以下方法增加一个值:
rootRef.child("score").setValue(ServerValue.increment(1));
对于 decremenet,需要以下代码行:
rootRef.child("score").setValue(ServerValue.increment(-1));
这是在 Firebase 数据库中设置值的方法:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("score").setValue(1);
假设你的score
字段为Integer类型,解决此问题,请使用以下方法:
public static void setScore(String operation) {
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
scoreRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Integer score = mutableData.getValue(Integer.class);
if (score == null) {
return Transaction.success(mutableData);
}
if (operation.equals("increaseScore")) {
mutableData.setValue(score + 1);
} else if (operation.equals("decreaseScore")){
mutableData.setValue(score - 1);
}
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {}
});
}
为此,我建议您一定要使用transactions
。如果用户尝试同时增加/减少分数,您将避免错误的结果。因此,作为结论,请根据您的增加/减少操作调用此方法。
您可以这样阅读:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Integer score = ds.getValue(Integer.class);
Log.d("TAG", score + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
scoreRef.addListenerForSingleValueEvent(eventListener);