Eu estou tentando gerar um número aleatório entre 1 e 5 e insira o número inteiro no banco de dados Firebase quando saveData()
é chamado pela primeira vez. Depois da primeira vez, quando saveData()
é chamado o número inteiro deve ser incrementado (novo número inteiro gerado deve ser adicionado ao nero inteiro previamente inserido). Toda vez que saveData()
é chamado o código abaixo ao longo escreve o inteiro previamente inserido em vez de incrementar o número inteiro.
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)
Estrutura que eu estou ficando no banco de dados firebase depois saveData()
é chamado para digamos 3 vezes e vamos dizer inteiros aleatórios gerados cada vez que são de 2, 1 e 4:
my-firebase-app-5c40
|__-Lhi7dewd7878dew
|__randomInt: 4 //2 is overwritten 1 and 1 is overwritten by 4
Considerando que eu quero que seja:
my-firebase-app-5c40
|__-Lhi7dewd7878dew
|__randomInt: 7 //2 + 1 + 4
Assim, em poucas palavras eu quero incrementar o valor de randomInt
cada vez que saveData()
é chamado em vez de substituir o valor inserido anterior que está acontecendo com o meu código atual.
Você está procurando uma transação de banco de dados Firebase , que é a única maneira confiável para atualizar uma propriedade com base no seu valor existente em um ambiente multi-usuário. Com base no exemplo na documentação, o código deve ser algo como isto:
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);
}