【问题标题】:Insert integer if doesn't exist, increment if already exists in Firebase realtime database Android如果不存在则插入整数,如果 Firebase 实时数据库 Android 中已存在则递增
【发布时间】:2018-09-30 11:38:53
【问题描述】:

我正在尝试生成一个介于 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()
    }
}

用户.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

因此,简而言之,我想在每次调用 saveData() 时增加 randomInt 的值,而不是覆盖当前代码中发生的先前插入的值。

【问题讨论】:

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


    【解决方案1】:

    您正在寻找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);
        }
    

    【讨论】:

    【解决方案2】:

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

    val randomInt: Int
    

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

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

    为此,如果您在 3 次后得到这些数字,则运行 random 函数 3 次,然后保存 3 次运行代码的每个值并将其作为字符串发送到数据库中。

    【讨论】:

    • 使用此问题逻辑多次运行代码:stackoverflow.com/questions/26050410/…
    • 谢谢。我多次调用该函数没有问题。简而言之,我想在每次调用“saveData()”时用 1 到 5 之间的随机整数递增数据库中的“randomInt”整数。
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 2015-05-03
    • 2016-11-19
    • 2020-06-17
    • 2017-08-04
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多