如果不存在则插入整数,如果已存在于Firebase实时数据库Android中则增加整数

时间:2018-09-30 11:38:53

标签: java android firebase firebase-realtime-database kotlin

我正在尝试生成1到5之间的随机整数,并在首次调用saveData()时将整数插入Firebase数据库。第一次之后,调用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)

我叫saveData()后进入firebase数据库的结构说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 :(得分:3)

您正在寻找Firebase Database transaction,这是在多用户环境中根据属性的现有值更新属性的唯一可靠方法。根据文档中的示例,您的代码应如下所示:

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

答案 1 :(得分:0)

这是您要保存在数据库中的整数:

val randomInt: Int

基本上,随机函数可以正常工作。因此,如果您要在该用户的项目中保存2 +1 + 4,则可能应将数据作为字符串发送,并将数据库项目更改为字符串,以便能够另存为字符串。

  • 但是,您还需要更改将返回此类数字的随机函数。

要做到这一点,如果在三遍之后得到这些数字,请运行random函数三遍,然后保存三遍运行代码的每个值,然后将其作为字符串发送到数据库中。