Swift iOS:将数据插入Firebase数据库会覆盖现有数据

时间:2017-04-27 17:27:50

标签: ios swift firebase firebase-realtime-database

我在将新记录插入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)
    }
}

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

有人能指出我正确的方向只是插入新记录吗?谢谢!

1 个答案:

答案 0 :(得分:3)

这就是重点。插入对象时,整个早期对象将被覆盖。

例如,如果路径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