热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

创建修改多个节点的FirebaseAndroid事务

如何解决《创建修改多个节点的FirebaseAndroid事务》经验,为你挑选了1个好方法。

假设我有一个带有"用户"节点和"宠物"节点的项目.当用户获得宠物时,我想要将宠物的密钥添加到用户的"宠物"节点,并将用户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为不同操作提供的术语,我认为这是导致您混淆的原因:在处理可能被并发修改(例如增量计数器)损坏的数据时使用它.如需进一步阅读,请打开开头附带的链接.


推荐阅读
author-avatar
Phoenix-Valefor
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有