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)
上进行交易,然后只为其下的单个 属性 提供价值。
您的方案有几个选项:
不要使用(不完整的)User
class 来调用 setValue()
,而是直接更新特定的 属性 mutableData
。所以那会是 mutableData.child("count").setValue(42)
之类的东西。这样 mutableData
仍将包含所有属性,即使 User
class 不包含。
运行事务直接在属性你要修改的,所以:API.ref.databaseSpecificUser(id).child("count").runTransaction(...
。这样 mutableData
将仅适用于您正在修改的 属性,因此不会删除任何其他内容。在这里,您也不会使用 User
class,因为您 reading/writing 是一个 属性.
使用较新的 ServerValue.increment(1)
操作来增加计数。此操作效率更高,并且通常会导致更简单的代码。类似于:ServerValue.increment(1).child("count").setValue(ServerValue.increment(1));
我在 运行 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)
上进行交易,然后只为其下的单个 属性 提供价值。
您的方案有几个选项:
不要使用(不完整的)
User
class 来调用setValue()
,而是直接更新特定的 属性mutableData
。所以那会是mutableData.child("count").setValue(42)
之类的东西。这样mutableData
仍将包含所有属性,即使User
class 不包含。运行事务直接在属性你要修改的,所以:
API.ref.databaseSpecificUser(id).child("count").runTransaction(...
。这样mutableData
将仅适用于您正在修改的 属性,因此不会删除任何其他内容。在这里,您也不会使用User
class,因为您 reading/writing 是一个 属性.使用较新的
ServerValue.increment(1)
操作来增加计数。此操作效率更高,并且通常会导致更简单的代码。类似于:ServerValue.increment(1).child("count").setValue(ServerValue.increment(1));