获取DatabaseException时需要解决方案:Path是Firebase

时间:2016-11-19 16:12:53

标签: android firebase firebase-realtime-database

关注像this一样的similliar问题,如果这是FirebaseDatabase.updateChildren中的限制或者我做错了,我只想得到答案。

我知道我无法为/ USER指定更新,然后为/ USER / + getUid()+" /"指定不同的更新。 +"幻想" +" /" + pushKey

如果我还需要这两个更新是原子的,我该怎么办?

 childUpdates.put(USER + "/" + getUid(), map1);
 childUpdates.put(USER + "/" + getUid() + "/" + "fancy" + "/" + pushKey, map2);
 // Do a deep-path update
 ref.updateChildren(childUpdates, new DatabaseReference.CompletionLi....

更新添加说明:

值是字符串
这是map1

//
// FAN_OUT - User.LAST_VISITED_ADDRESS
//
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("last_visited_address", "pushKey");

这是map2

//
// FAN_OUT - User.FANCY
//
Map<String, Object> map2 = new HashMap();
map2.put("owner", "a path");

1 个答案:

答案 0 :(得分:5)

运行多位置更新语句时,Firebase数据库会循环显示您提供的地图。对于每个条目,它使用您提供的值更新位置/键。执行条目的顺序未指定。

这意味着如果您有两个冲突的键/路径,则不确定结果是什么。 E.g。

/path/to/object        { name: "Erik Hellberg" }
/path/to/object/id     6820170

如果服务器按照我上面的顺序执行操作,结果将是:

path
  to
    object
      id   : 6820170
      name: "Erik Hellberg"

但如果碰巧以相反的顺序执行它们,结果将是:

path
  to
    object
      id   : 6820170

由于不确定操作非常无用,因此数据库会拒绝更新。

获得结果的确定方法是:

/path/to/object        { id: 6820170, name: "Erik Hellberg" }

并且:

/path/to/object/name   "Erik Hellberg"
/path/to/object/id     6820170

由于此处的更新路径没有重叠,因此没有冲突。