当类不完全相同时,android java firebase runtransaction会删除值

ggazkfy8  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(330)

我在运行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”
你知道吗?

x8diyxa7

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

相关问题