Является ли моя реализация транзакции Firebase правильной? - PullRequest
0 голосов
/ 10 октября 2018

Я использую транзакцию для обновления значения с плавающей точкой в ​​моей базе данных 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), будет лиВ этом случае транзакция не воспринимается как возвращение необновленного значения в базу данных как то, что пользователь хочет, чтобы оно было установлено, поэтому не изменяло значение и успешно завершалось?

...