Вставить целое число, если не существует, увеличить, если оно уже существует, в базе данных реального времени Firebase Android - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь сгенерировать случайное целое число между 1 и 5 и вставить целое число в базу данных Firebase при первом вызове saveData().После первого вызова saveData() целое число должно увеличиваться (новое сгенерированное целое число должно быть добавлено к ранее вставленному целому числу).Каждый раз, когда saveData() вызывается ниже, код перезаписывает ранее вставленное целое число вместо увеличения целого.

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)

Структура, которую я получаю в базе данных Firebaseпосле вызова saveData() допустим 3 раза и допустим, что случайные целые числа, сгенерированные каждый раз, равны 2, 1 и 4:

    my-firebase-app-5c40
       |__-Lhi7dewd7878dew
               |__randomInt: 4 //2 is overwritten 1 and 1 is overwritten by 4 

В то время как я хочу, чтобы это было:

        my-firebase-app-5c40
       |__-Lhi7dewd7878dew
               |__randomInt: 7 //2 + 1 + 4

Итак, в двух словах, я хочу увеличивать значение randomInt каждый раз, когда вызывается saveData() вместо перезаписи предыдущего вставленного значения, что происходит с моим текущим кодом.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вы ищете Транзакция базы данных Firebase , которая является единственным надежным способом обновления свойства на основе его существующего значения в многопользовательской среде.Исходя из примера в документации, ваш код должен выглядеть примерно так:

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);
    }
0 голосов
/ 30 сентября 2018

Это целое число, которое вы пытаетесь сохранить в базе данных:

val randomInt: Int

По существу, случайная функция работает правильно.Поэтому, если вы пытаетесь сохранить 2 + 1 + 4 в элементе этого пользователя, вам, вероятно, следует отправить данные в виде строки и изменить элемент базы данных на строку, чтобы иметь возможность сохранять в виде строки.

  • Однако вам также нужно изменить случайную функцию, которая будет возвращать такие числа.

Чтобы сделать это, если вы получаете эти числа через три раза, запустите случайную функциютри раза, а затем сохраните каждое значение трехкратного выполнения кода и отправьте его в виде строки в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...