ios - Firebase 扇出数据以更新特定字段删除其他兄弟字段

标签 ios json swift firebase firebase-realtime-database

每个用户都有一个对话节点,每次新对话都有新消息时,我需要为参与对话的两个用户更新两个对话节点,我只想在这里更新“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/

相关文章:

ios - Swift:像 Lua 一样快速从数组中删除元素

ios - 为不适用于 ipad 的 View 添加边框

javascript - ajax url 选项可以采用一组 url 而不是仅一个

objective-c - 在 Xcode 中使用 NSURLConnection 发送 JSON 数据

swift 3.0 关于String初始化的问题

swift - 在 Swift 中将文本或数据 append 到文本文件

ios - 如何在根 TableView Controller 中通过 swift 在两个 TableView 之间建立 Segue 连接?

ios - UIProgressView不显示进度

iphone - 表格 View 重新加载单元格

支持将 JSON 数据绑定(bind)到 HTML 控件的 JavaScript 库/工具包?