当前位置: 首页 > 知识库问答 >
问题:

Swift:Firebase updateChildValues函数覆盖和删除位置处的其他键

彭俊智
2023-03-14

在Firebase中尝试同时更新不同JSON分支的值时,我遇到了一个特殊的问题。在创建新数据时,文档中提供的方法是完美的,

 let key = ref.child("posts").childByAutoId().key
 let post = ["uid": userID,
             "author": username,
             "title": title,
             "body": body]
 let childUpdates = ["/posts/\(key)": post,
                "/user-posts/\(userID)/\(key)/": post]
 ref.updateChildValues(childUpdates)

但当我尝试在多个位置更新数据时,它会覆盖其他键,就像我在使用设置值一样。这是我的密码。

 let userID = Auth.auth().currentUser?.uid
    userRef = Database.database().reference()

   let vehicle = ["make":make.text,
                   "model": model.text,
                   "year":year.text,
                   "color":color.text,
                   "doors":doors.text]
    let driver = ["currentEvent":eventID]
    let childUpdates = ["/users/\(userID!)": driver,
                        "/status/\(userID!)/driverInfo/vehicle": vehicle]
    userRef.updateChildValues(childUpdates)

我还附上了一张图片,显示在函数执行时哪些数据被删除,哪些数据没有被删除。

我相信我正在尝试做的是可能的,从我的理解来看,updateChildValues的全部目的是为了不覆盖其他子项。

感谢任何帮助。谢谢!

共有2个答案

丁嘉
2023-03-14

如果我弄错了,请纠正我,但如果我理解您的意图,这可能会产生更好的结果?

let userID = Auth.auth().currentUser?.uid
    userRef = Database.database().reference()

   let vehicle = ["make":make.text,
                   "model": model.text,
                   "year":year.text,
                   "color":color.text,
                   "doors":doors.text]
    let driver = ["currentEvent":eventID]
    let childUpdates = ["/users/": userID!),
                        "/status/\(userID!)/driverInfo": vehicle]
    userRef.updateChildValues(childUpdates)
韦昊焜
2023-03-14

目前您正在使用如下对象更新对象:

let childUpdates = ["/users/\(userID!)": driver,
                        "/status/\(userID!)/driverInfo/vehicle": vehicle]

您将对象(字典)作为childUpdates字典的值。这样做的目的是用这个对象替换所有子对象,这意味着删除要为其发送nil的值,例如,在您的情况下,您没有包含info或info that。

现在,如果您只想更改要提供的值,例如只更改车辆的saymakemodel的值,以及驾驶员的currentEvent,则必须为这些值指定特定路径

["/users/\(userID!)/currentEvent": eventID,
                        "/status/\(userID!)/driverInfo/vehicle/make": make.text, "/status/\(userID!)/driverInfo/vehicle/model": model.text]

我认为这将按照您的预期更新这些位置的值。

嗯。。。

 类似资料:
  • 我不太确定该怎么写,但我有一个名为的工作,它使用CloudConvert将上传的文件(例如PDF)转换为JPG。 单独使用,效果很好。我可以上传一个文件,它将被保存到S3,然后CloudConvert获取S3文件,转换它并上传它。完美。 有人知道我可以尝试什么吗?我甚至不确定从哪里开始调试它。

  • 问题内容: 假设我有两个模块: py b.py 我的目标是使用in的功能,但更改该函数返回的值。具体来说,即使我运行,也将其查找为全局名称的来源。我基本上是在尝试创建功能对象的副本,该副本与之相同但用于获取其全局变量。是否有合理而直接的方法? 这是一个例子: 结果是当前,但我希望如此。 我想出了两种可行的复杂方法,但是我对其中任何一种都不满意: 使用复制和粘贴在模块中重新定义。真正的功能比显示的要

  • 问题内容: 是否有可能覆盖 全局 功能,从而在一定程度上影响 全局 功能? 据我所知,该函数在包装NodeJS脚本的函数中作为参数提供: 有什么方法可以修改功能吗? 这可能只会影响脚本所在的脚本。 我们如何在流程级别进行修改? 问题答案:

  • 我有一个接口,当我尝试实现它的一个方法时,我得到了这个错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但两者都不重写另一个,其中T#1,T#2是类型变量:T#1扩展在类GenericQueue中声明的Comparable T#2扩展在接口IGenericQueue中声明的Comparable”下面是代码:

  • public void drop(字符串名称)--如果合适,从ArrayList中移除该项,并将其添加到当前房间。使用以下选项之一更新游戏的消息:1)玩家没有持有该项目,2)房间已经有一个项目,或者3)玩家已经成功地将该项目放入房间。这是此方法的目标,但当我运行它时,它总是跳到else语句中的currentMessage。 问题:我遇到的问题是,当我运行这个方法并试图将一个项目放到房间中时,它没有

  • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此