每个用户都有一个对话节点,每次新对话都有新消息时,我需要为参与对话的两个用户更新两个对话节点,我只想在这里更新“lastMessage”和“tinestamp”字段是我的尝试:
let fanoutObject = [userPath : dataToUpdate,
otherUserPath : dataToUpdate]
K.FirebaseRef.root.updateChildValues(fanoutObject)
每个用户的路径是:
"/users/{userID}/conversations/{conversationID}"
和数据更新:
let dataToUpdate:[String:AnyObject] = ["timestamp" : message.timestamp,
"lastMessage": message.textBody]
结果:
更新每个用户的节点对话但对话节点中的其他字段被删除!
每个用户的对话节点是:
"conversations" : {
"{conversationID}" : {
"lastMessage" : "your name ?",
"seen" : true,
"timestamp" : 1467849600000,
"with" : {
"country" : "US",
"firstName" : "John",
"profileImage" : "https://..."
}
}
}
请注意,conversations 节点位于 user 节点内,user 节点是根节点 users 内的一个元素
更新后是:
"conversations" : {
"{conversationID}" : {
"lastMessage" : "your name ?",
"timestamp" : 1467849600000,
}
}
但我只希望更新这两个值并保留其他值?
根据文档,我的代码应该可以工作:
updateChildValues
Update some of the keys for a defined path without replacing all of the data.
最佳答案
解析您的代码有点困难,但很可能是 updateChildValues()
的行为让您感到困惑。
当您调用 updateChildValues()
时,Firebase 服务器将遍历您传入的对象。对于其中的每个路径,它将用该路径中的值替换该路径中的整个值你通过了。
因此,如果您当前的 JSON 是:
{
"Users": {
"uidForUser1": {
"name": "iOSGeek",
"id": 2305342
},
"uidForUser2": {
"name": "Frank van Puffelen",
"id": 209103
}
}
更新是(JSON 格式,Firebase 数据库的通用语言):
{
"users/uidForUser2/name": "puf",
"users/uidForUser1/name": "My actual name"
}
您生成的 JSON 将是:
{
"Users": {
"uidForUser1": {
"name": "My actual name",
"id": 2305342
},
"uidForUser2": {
"name": "puf",
"id": 209103
}
}
但是如果您发送以下更新:
{
"users/uidForUser1": {
"name": "My actual name"
},
"users/uidForUser2": {
"name": "puf"
}
}
生成的 JSON 将是:
{
"Users": {
"uidForUser1": {
"name": "My actual name"
},
"uidForUser2": {
"name": "puf"
}
}
更新
更新同一对象中的两个字段,但保留其他字段不变:
{
"path/to/object/field1": "new value",
"path/to/object/field2": "new value2"
}
关于ios - Firebase 扇出数据以更新特定字段删除其他兄弟字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491029/