作者:Phoenix-Valefor | 来源:互联网 | 2023-02-12 22:39
假设我有一个带有"用户"节点和"宠物"节点的项目.当用户获得宠物时,我想要将宠物的密钥添加到用户的"宠物"节点,并将用户ID添加到宠物的"所有者"节点.
例:
{
"users":{
"user1":{
"pets":{
"pet1":true,
"pet3":true
}
...
}
},
"pets":{
"pet1":{
"owner":"user1",
...
},
...
}
}
我想确保两个更新都成功阻止状态不一致.
我在这里阅读了有关如何使用Firebase事务的信息,但是当我尝试创建修改相关值的事务时(使用dbRef.runTransaction(...)),我收到此DatabaseError错误:
该交易有太多的重试次数
当我在我修改的特定节点上调用runTransaction()时,事务似乎才有效(例如,调用
dbRef.child("users").child("user1").runTransaction(...));
但是,这对我没有帮助,因为我需要联系相关用户和宠物.如何使此交易有效?
1> Barak..:
根据Firebase文档,您不需要使用事务操作(我将在稍后解释).
为了在ONE PACKET中保存多个节点中的数据,我建议你构建一个Map <>数组,其中Key代表路径,而Value代表你想要存储的内容.
让我们说"user1"刚刚成为"pet4"的所有者,你的dbRereference指向根目录:
FirebaseDatabase dbRef = FirebaseDatabase.getInstance().getReference();
Map update = new HashMap<>();
update.put("users/user1/pets/pet4", true);
update.put("pets/pet4/owner", "user4");
稍后您可以运行.updateChildren(Map <,>)并附加一个监听器.
dbRef.updateChildren(update).addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful())
Log.d("Success!");
else
Log.d("Failure");
}
});
这样,如果发生故障,您的数据库将根本不会更改.
"事务"是Firebase为不同操作提供的术语,我认为这是导致您混淆的原因:在处理可能被并发修改(例如增量计数器)损坏的数据时使用它.如需进一步阅读,请打开开头附带的链接.