Insira inteiro se não existe, incremento se já existe no banco de dados em tempo real Firebase Android

user3787635:

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 randomIntcada vez que saveData()é chamado em vez de substituir o valor inserido anterior que está acontecendo com o meu código atual.

Frank Puffelen:

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

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=205450&siteId=1
Recomendado
Clasificación