gpt4 book ai didi

android - Firebase:以原子方式创建/更新多个子节点

转载 作者:行者123 更新时间:2023-11-29 14:45:03 25 4
gpt4 key购买 nike

假设我有一个带有“用户”节点和“宠物”节点的项目。当用户获得宠物时,我想将宠物的 key 添加到用户的“宠物”节点,并将用户 ID 添加到宠物的“主人”节点。

示例:

{
"users":{
"user1":{
"pets":{
"pet1":true,
"pet3":true
}
...
}
},
"pets":{
"pet1":{
"owner":"user1",
...
},
...
}
}

我想确保两次更新都成功以防止出现不一致的状态。

我阅读了有关如何使用 Firebase 事务的信息 here ,但是当我尝试创建一个修改相关值的事务时(使用 dbRef.runTransaction(...)),我得到这个 DatabaseError 错误:

The transaction had too many retries

只有当我在我修改的特定节点上调用 runTransaction() 时事务似乎才有效(例如,调用

dbRef.child("users").child("user1").runTransaction(...));

但是,这对我没有帮助,因为我需要联系相关用户和宠物。我怎样才能使这个交易有效?

最佳答案

根据 Firebase Docs ,您不需要使用事务操作(我稍后会对此进行解释)。

为了将数据保存在ONE PACKET的多个节点中,我建议您构建一个Map<>数组,其中Key表示路径,Value 表示您想要存储在其中的任何内容。

假设“user1”刚刚成为“pet4”的所有者,并且您的 dbRereference 指向根目录:

FirebaseDatabase dbRef = FirebaseDatabase.getInstance().getReference();

Map<String, Object> update = new HashMap<>();
update.put("users/user1/pets/pet4", true);
update.put("pets/pet4/owner", "user4");

稍后您可以运行 .updateChildren(Map<,>) 并附加一个监听器。

dbRef.updateChildren(update).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful())
Log.d("Success!");
else
Log.d("Failure");
}
});

这样如果发生故障,你的数据库根本不会改变。

“事务”是 Firebase 为不同操作提供的一个术语,我认为这是您混淆的原因:它用于处理可能被并发修改损坏的数据,例如增量计数器。如需进一步阅读,请打开开头所附的链接。

关于android - Firebase:以原子方式创建/更新多个子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com