Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android firebase实时中的增量值_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 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() {

应用程序上可能有多个人单击一个按钮,该按钮将在firebase中增加值并返回该值,但如果每个人现在同时单击该按钮,他们将获得相同的值,我如何增加每个人获得不同的值

     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);
}