【问题标题】:Using UpdateChildValues to delete from Firebase使用 UpdateChildValues 从 Firebase 中删除
【发布时间】:2016-11-22 13:23:05
【问题描述】:

我正在尝试同时从 Firebase 数据库中的多个位置删除数据。

Firebase docs 状态:

“删除数据的最简单方法是在对该数据位置的引用上调用 removeValue。您还可以通过将 nil 指定为另一个写入操作(例如 setValue 或 updateChildValues)的值来删除。您可以将此技术与updateChildValues 在单个 API 调用中删除多个子项。”

我的代码是

let childUpdates = [path1 : nil,
                    path2 : nil,
                    path3 : nil,
                    path4 : nil]

    ref.updateChildValues(childUpdates)

所有四个路径都是字符串,但我得到一个错误:

“没有更多上下文,表达式的类型是模棱两可的。”

我认为这是由于 nil 值而发生的,因为如果我将 nil 替换为其他任何值(例如 Int),错误就会消失。

使用 updateChildValues 从 Firebase 删除数据的正确方法是什么?我们希望它以与 Firebase 中的 removeValue() 函数类似的方式工作。我们更愿意这样做的原因是因为它可以在一次调用中从多个位置删除。

【问题讨论】:

  • 正如他们所说,我认为方法应该是updateChildValues(values: [AnyHashable : Any?]) 允许nil。谢谢提问!!!我从@Jay 那里找到了答案

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

所以这里的问题是

ref.updateChildValues(childUpdates)

需要 [String: AnyObject!] 参数来更新ChildValues 和 AnyObject!不能为 nil(即您不能使用 AnyObject?这是一个可以为 nil 的可选项)

但是,您可以这样做

let childUpdates = [path1 : NSNull(),
                    path2 : NSNull(),
                    path3 : NSNull(),
                    path4 : NSNull()]

因为任何对象!现在是 NSNull() 对象(不是 nil),Firebase 知道 NSNull 是一个 nil 值。

编辑

您可以对此进行扩展,也可以进行多位置更新。假设你有一个结构

items
   item_0
      item_name: "some item 0"
   item_1
      item_name: "some item 1"

并且您想要更新两个项目名称。这是快速代码。

func updateMultipleValues() {
    let path0 = "items/item_0/item_name"
    let path1 = "items/item_1/item_name"

    let childUpdates = [ path0: "Hello",
                         path1: "World"
    ]

    self.ref.updateChildValues(childUpdates) //self.ref points to my firebase
}

结果是

items
   item_0
      item_name: "Hello"
   item_1
      item_name: "World"

【讨论】:

  • 你拯救了我的一天
  • 非常感谢!这肯定需要在 Firebase 文档中,太令人沮丧了!
【解决方案2】:

我认为此错误来自您提供的第一行。您需要指定字典的类型。所以改成

let childUpdates: [String : AnyObject?] = [path1: nil, path2: nil,...]

【讨论】:

  • 不幸的是它不起作用。字典的预期类型是 [NSObject: AnyObject]。如果字典不是那种类型,updateChildValues 函数会报错。我们已经尝试更改 NSObjects 的路径,但它仍然抱怨 AnyObject? 上的 nil 值。似乎我们无法输入 nil 值,但他们在他们的文档中说我们可以,所以可能有一种我们还没有想出的方法。
  • 我认为如果您使用空字符串 "" Firebase 会删除它。试试看。
  • 它只是将路径中的值更改为空字符串
  • 那么我认为你应该沿着 removeValue 路径走,而不是尝试做你正在做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多