Cómo guardar la puntuación de los usuarios en Firebase y recuperarla en tiempo real en Android Studio
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
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 score
campo 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);