Android firebase实时中的增量值
应用程序上可能有多个人单击一个按钮,该按钮将在firebase中增加值并返回该值,但如果每个人现在同时单击该按钮,他们将获得相同的值,我如何增加每个人获得不同的值Android firebase实时中的增量值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,应用程序上可能有多个人单击一个按钮,该按钮将在firebase中增加值并返回该值,但如果每个人现在同时单击该按钮,他们将获得相同的值,我如何增加每个人获得不同的值 DatabaseReference reference = FirebaseDatabase.getInstance().getReference("queue"); reference.child(queue_id).addValueEventListener(new ValueEventListener() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("queue");
reference.child(queue_id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
currentNum = (long) dataSnapshot.child("currentNumber").getValue();
++currentNum;
dataSnapshot.child("currentNumber").getRef().setValue(++currentNum);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
根据您的代码,您将计数器增加1,但不会在数据库中发布相同的值。修改数据库时,使用HashMap更新数据库中的数据。 您可以尝试以下代码:
button.setOnClickListerner(new View.onClickListener() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("queue");
reference.child(queue_id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
currentNum = (long) dataSnapshot.child("currentNumber").getValue();
long newValue = currentNum + 1;
HasMap<String, Object> hashMap = new HashMap<>();
hashMap.put ("currentNumber", newValue);
reference.child(queue_id).updateChildren(hashMap);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
};
button.setOnClickListener(新视图.onClickListener(){
DatabaseReference=FirebaseDatabase.getInstance().getReference(“队列”);
reference.child(队列id).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
currentNum=(长)dataSnapshot.child(“currentNumber”).getValue();
long newValue=currentNum+1;
HasMap hashMap=新hashMap();
hashMap.put(“currentNumber”,newValue);
reference.child(queue_id).updateChildren(hashMap);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
};
希望这能奏效!您可以使用方法
事务处理
。请参阅此链接:
为了防止多个用户同时(几乎同时)更新同一节点时发生冲突,您需要使用一个事务。在您的情况下,这类似于:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("queue");
DatabaseReference numberRef = reference.child(queue_id).child("currentNumber");
numberRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Long value = mutableData.getValue(Long.class);
if (value == null) {
mutableData.setValue(1);
}
else {
mutableData.setValue(value+1);
}
return Transaction.success(mutableData);
}
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "runTransaction:onComplete:" + databaseError);
}
在多用户环境中,要始终使用一致的数据,正如@FrankvanPuffelen在他的文章中指出的那样。
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("queue");
DatabaseReference numberRef = reference.child(queue_id).child("currentNumber");
numberRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Long value = mutableData.getValue(Long.class);
if (value == null) {
mutableData.setValue(1);
}
else {
mutableData.setValue(value+1);
}
return Transaction.success(mutableData);
}
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "runTransaction:onComplete:" + databaseError);
}