Cómo guardar la puntuación de los usuarios en firebase y recuperarla en tiempo real en el estudio de Android
firebase-realtime-database (3)
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. De nuevo comienza 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 vuelvo a abrir, el valor de los puntos se muestra igual, pero cuando se hace clic en el botón, comienza nuevamente desde la condición inicial.
Aqui esta mi codigo
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, aumente los puntos al hacer clic en el botón antes de destruir la aplicación y subirla a la base de datos , vea la imagen 1
Aplicación abierta nuevamente (después del cierre) muestra el mismo punto actualizado , vea la imagen 2
Ahora, cuando hago clic en reclamar, vuelve a 100 , vea la imagen número 3
por favor ayúdame en este problema, y soy un novato Gracias
Así es como establece un valor en su base de datos Firebase:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("score").setValue(1);
Suponiendo que su campo de
score
es de tipo Integer, 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 definitivamente uses
transactions
.
Evitará resultados incorrectos si los usuarios intentan aumentar / disminuir la puntuación al mismo tiempo.
Como conclusión, llame a este método de acuerdo con su operación de aumento / disminución.
Así es como 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);
Creo que la puntuación anterior es una cadena en su código @DHANANJAY KUMAR y no se pueden agregar cadenas y también cuál es el significado de
String.class
.
Creo que se puede hacer
int previousScore = dataSnapshot.getValue(Integer.class);
si podemos editar
String.class
a
Integer.class
o
int.class
Por favor aclarar
Primero debe obtener el valor del puntaje anterior y luego agregarlo con el puntaje actual y luego actualizar el valor final en la base de datos de Firebase.
question_score.child("score").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String previousScore = dataSnapshot.getValue(String.class);
if (previousScore!=null){
int finalScore = Integer.parseInt(previousScore) + current_score;
question_score.child("score").setValue(String.valueOf(finalScore));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});