2016-03-05 4 views
1

Я пытаюсь использовать runTransaction для базы данных Firebase, но он не работает. Вот код, который я использую.Firebase runTransaction не работает

numQuestionRef.runTransaction(new Transaction.Handler() { 
    @Override 
    public Transaction.Result doTransaction(MutableData mutableData) { 
     String numQuestions = (String) mutableData.getValue(); 
     long value = Long.parseLong(numQuestions, 16); 
     value++; 
     String incHex = Long.toHexString(value); 
     mutableData.setValue(incHex); 
     return Transaction.success(mutableData); 
    } 

    @Override 
    public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) { 


    } 
}); 

Этот код активирован, когда я нажимаю кнопку в своем приложении. Когда я нажимаю кнопку в первый раз с момента запуска приложения, моя база данных не изменяется. Но когда я нажимаю кнопку второй раз с момента запуска приложения, он обновляет его до следующего номера. Я не понимаю, что это неправильно или почему это делается только при нажатии второй кнопки.

ответ

5

Вы хотите следовать шаблону, используемый в Firebase documentation for handling transactions и обрабатывают случай, когда нет текущего значения вашей транзакции обратного вызова:

public Transaction.Result doTransaction(MutableData currentData) { 
    long value = 0; 
    if(currentData.getValue() != null) { 
     String numQuestions = (String) currentData.getValue(); 
     value = Long.parseLong(numQuestions, 16); 
    } 
    value++; 
    String incHex = Long.toHexString(value); 
    currentData.setValue(incHex); 
    return Transaction.success(currentData); 
} 

Причины вам нужно сделать, это то, что Firebase может (и часто будет) выполнять ваш обратный вызов транзакции несколько раз, и вам нужно это обслуживать.

  1. При первом вызове runTransaction() клиент Firebase немедленно вызвать ваш doTransaction() обратный вызов с его текущей догадкой для текущих данных. Довольно часто это будет null.
  2. Ваш код возвращает следующее значение, основанное на текущем значении. В приведенном выше случае, если текущее значение было null, новое значение будет 1.
  3. Клиент Firebase затем отправляет на сервер как предполагаемое текущее значение, так и новое значение.
  4. Если фактическое сохраненное значение совпадает с предполагаемым текущим значением, сервер Firebase записывает новое заданное вами значение.
  5. Если фактические сохраненные значения отличаются от предполагаемого текущего значения, сервер Firebase отклоняет новое значение и отправляет текущее текущее значение клиенту.
  6. На этом этапе клиент возвращается к шагу 1 с обновленным текущим текущим значением.

Если это не объясняет поведение, которое вы видите, вы можете проверить, какие значения переданы в onComplete().

Смежные вопросы