我正在尝试生成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()
的值,而不是覆盖当前代码中发生的先前插入的值。
答案 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函数三遍,然后保存三遍运行代码的每个值,然后将其作为字符串发送到数据库中。