Вы ищете транзакцию базы данных Firebase здесь. Из документации :
При работе с данными, которые могут быть повреждены одновременными изменениями, такими как инкрементные счетчики, вы можете использовать операцию транзакции.
Поначалу транзакция Firebase может быть немного необычной, поскольку вы явно не устанавливаете блокировку данных. Вместо этого вы пишете функцию, которая вызывается с предположением для текущего значения узла базы данных, и ваша функция возвращает новое значение, которое сервер должен сохранить в этом случае.
В вашем случае это выглядело бы примерно так:
databaseReference.child(node).runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData data) {
if (data.getValue() == null) {
// TODO: call data.setValue(...) to set the initial data for the node
return Transaction.success(mutableData);
}
if (TextUtils.isEmpty(data.child("confirmed_walker").getValue(String.class))) {
// TODO: call data.setValue(...) to set the data for a confirmed walker
// Report transaction success, so that the server tries to commit it
return Transaction.success(mutableData);
}
// Abort the transaction, since we have nothing to do
return Transaction.abort();
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "runTransaction:onComplete:" + databaseError);
}
});
* Обновление **: поскольку кажется, что вы только читаете / записываете узел confirmed_walker
, вы можете выполнить транзакцию только на этом узле, уменьшив конкуренцию и сделав код немного проще:
databaseReference.child(node).child("confirmed_walker").runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData data) {
if (data.getValue() == null) {
// Set the driver ID for this node
String driverIdd = preference.getLongDetail(Constants.DRIVER_ID);
data.setValue(driverIdd);
// Report transaction success, so that the server tries to commit it
return Transaction.success(mutableData);
}
// Abort the transaction, since we have nothing to do
return Transaction.abort();
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "runTransaction:onComplete:" + databaseError);
}
});