当类不完全相同时,Android Java Firebase runTransaction会删除值



我在运行runTransaction函数更新值时遇到问题,当类不同时,该函数会从类中删除值让我试着解释

关于我的userModel类应用程序版本1.0具有以下属性的用户模型

-用户名-uid-跟随

应用程序版本1.1具有具有以下属性的用户模型-用户名-uid-跟随

  • 状态(已添加(

因此userModel有一个额外的属性

当使用appVersion 1.0的用户现在在使用appVersion 1.1的用户上运行事务时(例如,当执行时,我将关注者增加1(,用户1.0执行的事务只设置其当前版本中的值,因此删除了版本为1.1的用户的STATUS

我的代码

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不包含";STATUS";在用户模型类中

知道吗?

事务必须为运行它的位置提供完整的新值。不能在API.ref.databaseSpecificUser(id)上运行事务,然后只为其下的单个属性提供值。

在您的场景中有几个选项:

  1. 不要使用(不完整的(User类来调用setValue(),而是只直接更新mutableData上的特定属性。所以这将类似于mutableData.child("count").setValue(42)。这样一来,即使User类不包含,mutableData仍将包含所有属性。

  2. 直接在要修改的属性上运行事务,因此:API.ref.databaseSpecificUser(id).child("count").runTransaction(...。这样一来,mutableData将只用于您正在修改的属性,因此不会删除任何其他内容。在这里,您也不会使用User类,因为您正在读/写单个属性。

  3. 使用较新的ServerValue.increment(1)操作来递增计数。此操作的效率要高得多,并且通常会导致更简单的代码。类似于:ServerValue.increment(1).child("count").setValue(ServerValue.increment(1));

最新更新