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.
-
Cuando llame por primera vez a
runTransaction()
el cliente Firebase invocará inmediatamente su devolución de llamadadoTransaction()
con su estimación actual de los datos actuales. Muy a menudo esto seránull
. -
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
. - El cliente Firebase luego envía tanto el valor actual asumido como el nuevo valor al servidor.
- Si el valor real almacenado es el mismo que el valor actual asumido, el servidor Firebase escribe el nuevo valor que especificó.
- 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.
- 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()
.