我在运行runtransaction函数来更新值时遇到了一个问题,当类不同时,这个函数会从类中删除值让我解释一下
关于我的用户模型类应用程序版本1.0有以下属性的用户模型
-用户名-uid-followers
应用程序版本1.1的用户模型具有以下属性-用户名-uid-followers
状态(已添加)
所以usermodel有一个附加属性
当使用appversion 1.0的用户现在在使用appversion 1.1的用户上运行事务时(例如,在following时,我将followers增加1),用户1.0完成的事务仅设置其在当前版本中的值,因此删除版本为1.1的用户的状态
我的代码
API.ref.databaseSpecificUser(id).runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(final MutableData mutableData) {
final User user = mutableData.getValue(User);
if (user== null) {
return Transaction.success(mutableData);
}
.....
mutableData.setValue(user);
return Transaction.success(mutableData);
}
这个
mutableData.setValue(user);
更新值但不设置状态,因为应用程序版本1.0在usermodel类中不包含“status”
你知道吗?
1条答案
按热度按时间x8diyxa71#
事务必须为运行它的位置提供完整的新值。无法在上运行事务
API.ref.databaseSpecificUser(id)
然后只为其下的单个属性提供一个值。在您的场景中有几个选项:
不要使用(不完整的)
User
呼叫类setValue()
,但只直接更新mutableData
. 那就好像mutableData.child("count").setValue(42)
. 这条路mutableData
仍将包含所有属性,即使User
班上没有。直接在要修改的属性上运行事务,以便:
API.ref.databaseSpecificUser(id).child("count").runTransaction(...
. 那样的话mutableData
将只适用于您正在修改的属性,因此不会删除任何其他内容。这里也一样,你不会用你的User
类,因为您正在读/写单个属性。使用更新的
ServerValue.increment(1)
增加计数的操作。此操作效率更高,通常会导致代码更简单。比如:ServerValue.increment(1).child("count").setValue(ServerValue.increment(1));