我正在查看这个针对Flutter(dartlang)的Firebase API的演示程序,并在查看原始源代码之后。我不是在考虑runTransaction
和set()
之间的区别以及为什么作者使用了另一个。
Future<Null> _increment() async {
// Increment counter in transaction.
final TransactionResult transactionResult =
await _counterRef.runTransaction((MutableData mutableData) async {
mutableData.value = (mutableData.value ?? 0) + 1;
return mutableData;
});
if (transactionResult.committed) {
_messagesRef.push().set(<String, String>{
_kTestKey: '$_kTestValue ${transactionResult.dataSnapshot.value}'
});
} else {
print('Transaction not committed.');
if (transactionResult.error != null) {
print(transactionResult.error.message);
}
}
}
根据来源runTransaction
中的评论是:
对此Firebase数据库位置的数据执行乐观并发事务更新。
对于set
方法,评论说:
写入的效果将立即显示,并触发相应的事件。还将启动数据与Firebase数据库服务器的同步。
有人ELI5有什么不同,为什么作者选择了两种不同的方法写入数据库?
完整的演示代码为here
答案 0 :(得分:1)
我无法告诉你为什么作者选择了一个而不是另一个,但是交易和常规写作之间的区别非常清楚。
常规写入正是名称所暗示的:它将值写入您指定的位置。
在Firebase数据库中,您可以使用事务根据该位置的当前值将新值写入某个位置。因此它结合了读取和写入操作。 Firebase交易有些不同寻常之处在于它们是比较和设置操作。
有关这意味着什么的详细信息,我建议您阅读以下内容:
该链接还显示了事务与自己读取和写入事务的不同之处:如果当前值在读取后未被修改,则事务将仅执行写入操作。
答案 1 :(得分:0)
通过阅读弗兰克的答案后,我理解作者选择runTransaction()
vs set()
的原因。
因此,ELI5版本就是runTransaction()
用于更新与_counterRef
相关联的数据库条目。我们对现有条目进行更新,具体来说,我们更新按钮按下次数的整数值。
set()
方法与push()
一起使用向网上添加新条目。该值是使用runTransaction()
方法中更新的相同值的键值字符串,即值mutableData.value
和transactionResult.dataSnapshot.value
相同。