Android Java Firebase runTransaction 在 类 不完全相同时删除值

Android Java Firebase runTransaction deletes values when classes are not exactly the same

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

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

-用户名 -uid -追随者

应用版本 1.1 的用户模型具有以下属性 -用户名 -uid -追随者

所以 userModel 多了一个属性

当使用 appVersion 1.0 的用户现在对使用 appVersion 1.1 的用户运行交易时(例如,在关注时,我将关注者增加 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 class

中不包含“STATUS”

有什么想法吗?

交易必须为您 运行 所在的位置提供全新的价值。您不能 运行 在 API.ref.databaseSpecificUser(id) 上进行交易,然后只为其下的单个 属性 提供价值。

您的方案有几个选项:

  1. 不要使用(不完整的)User class 来调用 setValue(),而是直接更新特定的 属性 mutableData。所以那会是 mutableData.child("count").setValue(42) 之类的东西。这样 mutableData 仍将包含所有属性,即使 User class 不包含。

  2. 运行事务直接在属性你要修改的,所以:API.ref.databaseSpecificUser(id).child("count").runTransaction(...。这样 mutableData 将仅适用于您正在修改的 属性,因此不会删除任何其他内容。在这里,您也不会使用 User class,因为您 reading/writing 是一个 属性.

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