updatechildren recuperar query guardar example datos datasnapshot consultas android firebase firebase-realtime-database transactions

query - recuperar datos firebase android



Firebase runTransaction no funciona: MutableData es nulo (1)

Estoy tratando de usar runTransaction() de la base de datos de Firebase pero no funciona. Aquí está el código que estoy usando.

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

Este código se activa cuando presiono un botón dentro de mi aplicación. Cuando presiono el botón por primera vez desde que inicié la aplicación, mi base de datos no cambia. Pero cuando presiono el botón la segunda vez desde que inicié la aplicación, la actualiza al siguiente número. No entiendo qué está mal o por qué solo lo hace al presionar el segundo botón.


Querrá seguir el patrón utilizado en la documentación de Firebase para manejar transacciones y manejar el caso donde no hay un valor actual de la devolución de llamada de su transacción:

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

La razón por la que necesita hacer esto es que Firebase puede (y a menudo lo hará) ejecutar su devolución de llamada de transacción varias veces y debe atenderlo.

  1. Cuando llame por primera vez a runTransaction() el cliente Firebase invocará inmediatamente su devolución de llamada doTransaction() con su estimación actual de los datos actuales. Muy a menudo esto será null .
  2. Su código devuelve el siguiente valor basado en el valor actual. En el caso anterior, si el valor actual era null el nuevo valor será 1 .
  3. El cliente Firebase luego envía tanto el valor actual asumido como el nuevo valor al servidor.
  4. Si el valor real almacenado es el mismo que el valor actual asumido, el servidor Firebase escribe el nuevo valor que especificó.
  5. Si los valores reales almacenados son diferentes del valor actual asumido, el servidor Firebase rechaza el nuevo valor y envía el valor actual real al cliente.
  6. En esta etapa, el cliente vuelve al paso 1, con el valor actual asumido ahora actualizado.

Si esto no explica el comportamiento que está viendo, es posible que desee verificar qué valores se pasan a onComplete() .