获取DatabaseException时需要解决方案:Path是Firebase中的祖先

Exo*_*Kid 0 android firebase firebase-realtime-database

继续像这样的similliar问题,我只想得到答案,如果这是一个限制FirebaseDatabase.updateChildren或如果我做错了.

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

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

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

更新添加说明:

值是字符串,
这是map1

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

这是map2

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

Fra*_*len 5

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

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

/path/to/object        { name: "Erik Hellberg" }
/path/to/object/id     6820170
Run Code Online (Sandbox Code Playgroud)

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

path
  to
    object
      id   : 6820170
      name: "Erik Hellberg"
Run Code Online (Sandbox Code Playgroud)

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

path
  to
    object
      id   : 6820170
Run Code Online (Sandbox Code Playgroud)

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

获得结果的确定性方法是:

/path/to/object        { id: 6820170, name: "Erik Hellberg" }
Run Code Online (Sandbox Code Playgroud)

和:

/path/to/object/name   "Erik Hellberg"
/path/to/object/id     6820170
Run Code Online (Sandbox Code Playgroud)

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