【问题标题】:Swift iOS: Inserting data into Firebase database overwrites existing dataSwift iOS:将数据插入 Firebase 数据库会覆盖现有数据
【发布时间】:2017-04-28 01:35:35
【问题描述】:

我在将新记录插入 Firebase 数据库时遇到问题。虽然我可以添加新记录,但我之前的所有数据都将被覆盖。

在 Firebase 我有这个简单的数据模型:

{
  "appName": {
    "devices": {
      "CBB60958-3D6E-4F42-96AE-6345471B1F38": {
        "lat": 37.39747477,
        "lon": -122.17969227,
        "updated": 1493312965,
        "username": "username"
      }
    }
  }
}

guid 代表设备 ID。如果加载了新设备,我想以相同的格式将新记录添加到“跟踪”部分。我有以下更新功能:

fileprivate func initializeDevice() {
    if !deviceExists {
        let post = [self.guid: [
            "lat" : locationManager.location?.coordinate.latitude ?? 0.0,
            "lon" : locationManager.location?.coordinate.longitude ?? 0.0,
            "updated" : Int(Date().timeIntervalSince1970),
            "username" : username ]]  
        dbRef.child("devices").setValue(post)
    }
}

我一直在测试数据库参考中可用的每种方法,虽然我能够插入记录,但我之前的所有设备记录都被删除,只留下当前记录。因此,我的代码似乎正在更新设备部分中的所有数据,而不是向其附加新记录。

谁能指出我插入新记录的正确方向?谢谢!

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    这就是重点。当您插入一个对象时,整个较早的对象都会被覆盖。

    例如,如果您在路径 uid.messages.messageid 处有一个对象,并且您保存到所说的 messageid,则整个对象将被覆盖。因此,您基本上需要拥有旧对象,对其进行更改,然后将其保存回来。

    在您的情况下,您使用代码dbRef.child("devices").setValue(post)。您正在设置任何帖子的路径的值。

    要为引用创建一个新子项,通常会执行以下操作。首先,使用childByAutoId 方法获取一个新的唯一ID,然后您可以通过let key = childByAutoId().key 访问该ID。然后使用reference.key 将新对象保存到引用中。

    如果您还没有这样做,请查看 Firebase 文档中的教程/指南。他们对您应该使用的数据结构(即制作扁平结构而不是嵌套结构)以及如何访问和更新数据以提高效率有一些很好的建议。

    最后,这里的文档会告诉你相同的答案:https://firebase.google.com/docs/database/ios/read-and-write

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2020-12-03
      • 2021-10-09
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多