android firebase firebase-realtime-database

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) { } });