He intentado ejecutar el método de transacción, pero no puedo obtener ni configurar los datos adecuados en Firebase Realtime Database.

El siguiente es el código:

 private void receiveMoney() {
    String mobile=recipientText.getText().toString().trim();
    Double amount=Double.parseDouble(amountText.getText().toString().trim());
    mDatabase3=FirebaseDatabase.getInstance().getReference("account_details/Gn2eRixQQiTpvhX870n6nZp66tO2");
    mDatabase3.runTransaction(new Transaction.Handler() {

        @NonNull
        @Override
        public Transaction.Result doTransaction(@NonNull MutableData currentData) {

            Double newBalance=(double) currentData.child("initialBalance").getValue();
            System.out.println("Current Balance: "+newBalance+"  Amount: "+amount);

            currentData.setValue(newBalance);
            return Transaction.success(currentData);
        }

        @Override
        public void onComplete(@Nullable  DatabaseError error, boolean committed, @Nullable DataSnapshot currentData) {

        }
    });
}

Lo siguiente es mi base de datos: Captura de pantalla de la base de datos

A continuación se muestra el error que obtengo en el registro de ejecución:

E/RepoOperation: Caught Throwable.
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
    at com.example.efikas.SendMoneyActivity$1.doTransaction(SendMoneyActivity.java:86)
    at com.google.firebase.database.core.Repo.startTransaction(Repo.java:933)
    at com.google.firebase.database.DatabaseReference$4.run(DatabaseReference.java:492)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:784)

Introduzca el código aquí

2
yuri yuna 2 oct. 2021 a las 12:05

2 respuestas

La mejor respuesta

Para incrementar el valor de initialBalance con el valor de amount, no es necesario utilizar ninguna transacción. Simplemente puede incrementar el valor usando las siguientes líneas de código:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference initialBalanceRef = db
    .child("account_details")
    .child("Gn2eRixQQiTpvhX870n6nZp66tO2")
    .child("initialBalance");
initialBalanceRef.setValue(ServerValue.increment(amount));

Eso es todo. Si aún desea utilizar una transacción, verifique mi respuesta de la siguiente publicación:

2
Alex Mamo 2 oct. 2021 a las 11:09

Creo que porque estás usando runTransaction y creo que deberías enfocarte solo en una cosa.

mDatabase3=FirebaseDatabase.getInstance().getReference("account_details/Gn2eRixQQiTpvhX870n6nZp66tO2/initialBalance");
mDatabase3.runTransaction(new Transaction.Handler() {

    @NonNull
    @Override
    public Transaction.Result doTransaction(@NonNull MutableData currentData) {
        if (currentData.getValue() == null) {
            currentData.setValue(0);
        } else {
            Double newBalance= (Double) currentData.getValue();
            System.out.println("Current Balance: "+newBalance+"  Amount: "+amount);

            currentData.setValue(newBalance);
        }
        

        return Transaction.success(currentData);
    }

    @Override
    public void onComplete(@Nullable  DatabaseError error, boolean committed, @Nullable DataSnapshot currentData) {

    }
});
0
Ticherhaz FreePalestine 2 oct. 2021 a las 09:27