触发查询以返回单个子项并更新值

时间:2017-12-30 03:19:00

标签: json swift firebase firebase-realtime-database

我有一个使用.queryEqual查询Firebase的函数来获取我想要更新的节点,但我不知道如何将值设置为false。这是我的功能:

func addrShipDefault() {
    let ref = Router.addrShip.reference().child(self.userId)
    let query = ref.queryOrdered(byChild: "isDefault").queryEqual(toValue: true)
    query.setValue(false, "isDefault")
}

有人能告诉我如何查询Firebase以查找我要查找的节点并更新其值吗?

我使用ref.updateChildValues做了其他更新,但对于那些我知道确切路径的人。这次我需要查找isDefault设置为true的节点并修改它。

希望这有意义!!

感谢您的帮助

****更新显示数据库结构

{
  "addr_01" : {
    "address1" : "63 Park Ave",
    "address2" : "Unit #2",
    "city" : "Greenland",
    "firstName" : "John",
    "id" : "addr_01",
    "isDefault" : true,
    "lastName" : "Smith",
    "state" : "MA",
    "zipcode" : "01890"
  },
  "addr_02" : {
    "address1" : "101 Lafayette Rd",
    "address2" : "",
    "city" : "Rye",
    "firstName" : "Say It In 3D",
    "id" : "addr_02",
    "isDefault" : false,
    "lastName" : "",
    "state" : "NH",
    "zipcode" : "03870"
  }
}

1 个答案:

答案 0 :(得分:0)

来自官方文档here

  

您可以更新孩子   不重写整个对象。如果你想允许用户   更新他们的个人资料,您可以更新用户名,如下所示:

let ref = Router.addrShip.reference().child(self.userId)
let query = ref.queryOrdered(byChild: "isDefault").queryEqual(toValue: true)

//query.child("isDefault").setValue(false)

//Updated Code

query.observeSingleEvent(of: .childAdded) { (snapshot) in
          let newRef = snapshot.ref.child("isDefault")
          newRef.setValue(false, withCompletionBlock: { (err, ref) in
                   print("SetValue")
          })
} 

现在在你的案例中使用上面的例子:

我们可以这样做:(我没有尝试过,但我认为你可以得到这个想法)

setValue

请注意官方文档here

func setValue(_ value: Any?) 方法的函数签名如下:

func setValue(_ value: Any?, withCompletionBlock block: @escaping (Error?, DatabaseReference) -> Void)

如上所示,它接受任何类型值的可选项,这意味着您可以为有效的json传递任何值。

另请注意,还有一个带完成块的方法

a=[2;3];
b=[4;5];
c=[1;1];