Cómo guardar la puntuación de los usuarios en Firebase y recuperarla en tiempo real en Android Studio

Resuelto Hash asked hace 54 años • 3 respuestas

Estoy creando una aplicación en la que los puntos aumentan al hacer clic en el botón y esos puntos deben guardarse en Firebase. Logré guardar esos datos en Firebase. Pero cuando destruyo mi aplicación y la abro nuevamente, el valor de los puntos se muestra igual pero después de hacer clic en el botón. Se vuelve a empezar desde 0.

Por ejemplo: cada vez que se hace clic en el botón, el valor de los puntos aumenta a 10 puntos. Ahora, cuando destruyo completamente la aplicación y la abro nuevamente, el valor de los puntos se muestra igual, pero cuando hago clic en el botón, comienza nuevamente desde la condición inicial.

Aquí está mi código.

    int amount = 0;

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

button_claim.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            amount = amount + 100;


            textView_points.setText(String.valueOf(amount));
            databaseReference.setValue(textView_points.getText().toString());

        }
    });


}


@Override
    protected void onStart() {
    super.onStart();
    if (mAuth.getCurrentUser() == null) {
        finish();
        Intent main = new Intent(this,MainActivity.class);
        main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(main);
    }

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            textView_points.setText(dataSnapshot.getValue(String.class));
            databaseReference.setValue(textView_points.getText().toString());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

            Toast.makeText(Main2Activity.this,"error",Toast.LENGTH_LONG).show();
        }
    });



    }

Antes de destruir la aplicación , vea la imagen, los puntos aumentan al hacer clic en el botón antes de destruir la aplicación y cargarla en la base de datos, consulte la imagen 1.

Al abrir la aplicación nuevamente (después de cerrarla), se muestra el mismo punto actualizado. Consulte la imagen 2.

Ahora, cuando hago clic en reclamar, vuelve a 100. Consulte la imagen número 3.

por favor ayúdenme con este problema, soy un novato gracias

Hash avatar Jan 01 '70 08:01 Hash
Aceptado

Editar: 29 de junio de 2020

Ahora también es posible resolver este problema sin el uso de una transacción. Simplemente podemos incrementar un valor usando:

rootRef.child("score").setValue(ServerValue.increment(1));

Y para decremenet, se requiere la siguiente línea de código:

rootRef.child("score").setValue(ServerValue.increment(-1));

Así es como estableces un valor en tu base de datos de Firebase:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("score").setValue(1);

Suponiendo que su scorecampo es de tipo Entero, para resolver esto, utilice el siguiente método:

public static void setScore(String operation) {
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference scoreRef = rootRef.child("score");
    scoreRef.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Integer score = mutableData.getValue(Integer.class);
            if (score == null) {
                return Transaction.success(mutableData);
            }

            if (operation.equals("increaseScore")) {
                mutableData.setValue(score + 1);
            } else if (operation.equals("decreaseScore")){
                mutableData.setValue(score - 1);
            }

            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {}
    });
}

Para esto, te recomiendo que uses definitivamente transactions. Evitará resultados incorrectos si los usuarios intentan aumentar o disminuir la puntuación al mismo tiempo. Entonces, como conclusión, llame a este método de acuerdo con su operación de aumento/disminución.

Así puedes leerlo:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Integer score = ds.getValue(Integer.class);
        Log.d("TAG", score + "");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
scoreRef.addListenerForSingleValueEvent(eventListener);
Alex Mamo avatar Jan 17 '2018 19:01 Alex Mamo