Я использую транзакцию для обновления значения с плавающей точкой в моей базе данных Firebase (см. Ниже).Работает нормально, за исключением одного раза, когда значение не обновлялось.Все остальное работало отлично (вы увидите, что в onComplete
также есть обновление объекта).На боковой ноте;это обновление для другого дочернего элемента в базе данных показало, что Input
было правильным значением.
Мне не удалось воссоздать это, и я не могу найти что-либо в журналах, связанных с этой конкретной транзакцией.
Мой вопрос заключается в том, выглядит ли эта реализация транзакции Firebase подверженной ошибкам.IOW, я неправильно это реализовал?
private void onInboundTransactionConfirm(DatabaseReference piclCount) {
piclCount.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
float P = mutableData.getValue(Float.class);
// Set value and report transaction success
mutableData.setValue(P + Input);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
String transKey = transactionRef.child(recipientId).push().getKey();
TransactionRecord inbound = new TransactionRecord("Transfer", Input, userDirectCode, UserName);
transactionRef.child(recipientId).child(transKey).setValue(inbound);
// TransactionRecord completed
Log.d(TAG, "postInboundTransaction:onComplete:" + databaseError);
}
});
}
РЕДАКТ. 1: К этой строке прикреплено следующее предупреждение: float P = mutableData.getValue(Float.class);
:
Unboxing of 'mutableData.getValue(Float.class)' may produce 'java.lang.NullPointerException'
РЕДАКТИРОВАТЬ2 : я мог бы сделать это:
public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
float P = mutableData.getValue(Float.class);
if (Input != 0) {
// Set value and report transaction success
mutableData.setValue(P + Input);
}
return Transaction.success(mutableData);
}
Но меня беспокоит то, что если обновленное значение не будет установлено (т.е. по какой-то причине Input
равно 0
), будет лиВ этом случае транзакция не воспринимается как возвращение необновленного значения в базу данных как то, что пользователь хочет, чтобы оно было установлено, поэтому не изменяло значение и успешно завершалось?