Estoy intentando generar un entero aleatorio entre 1 y 5 e introduzca el número entero en la base de datos Firebase cuando saveData()
se llama por primera vez. Después de la primera vez, cuando saveData()
se llama el número entero debe ser incrementado (nuevo número entero generado debe añadirse a número entero previamente insertada). Cada vez que saveData()
se llama a continuación código a través escribe el número entero insertado previamente en lugar de incrementar el número entero.
protected fun saveData() {
val randomInt = Random().nextInt((5-1) + 1)//generates int between 1 & 5
val user = User(randomInt)
val currentUser = mAuth?.currentUser
val uid: String = currentUser!!.uid
val ref = FirebaseDatabase.getInstance().getReference("users").child(uid)
ref.setValue(user).addOnCompleteListener {
Toast.makeText(this,"Successful" , Toast.LENGTH_SHORT).show()
}
}
User.kt
class User(val randomInt: Int)
Estructura que me estoy poniendo en la base de datos base de fuego después de saveData()
que se llama para que digamos 3 veces y le dicen enteros aleatorios generados cada vez son 2, 1 y 4:
my-firebase-app-5c40
|__-Lhi7dewd7878dew
|__randomInt: 4 //2 is overwritten 1 and 1 is overwritten by 4
Mientras que yo quiero que sea:
my-firebase-app-5c40
|__-Lhi7dewd7878dew
|__randomInt: 7 //2 + 1 + 4
Así, en pocas palabras quiero para incrementar el valor de randomInt
cada saveData()
se llama en lugar de sobrescribir el valor insertado anterior que está pasando con mi código actual.
Usted está buscando una transacción de base de datos Firebase , que es la única manera confiable para actualizar una propiedad en función de su valor existente en un entorno multi-usuario. Basado en el ejemplo en la documentación, el código debe ser algo como esto:
val ref = FirebaseDatabase.getInstance().getReference("users").child(uid).child("randomInt")
ref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Long value = mutableData.getValue(Long.class);
if (p == null) {
mutableData.setValue(1L);
return Transaction.success(mutableData);
}
else {
mutableData.setValue(value + 1);
}
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
Log.d(TAG, "transaction:onComplete:" + databaseError);
}