ios - swift iOS : Inserting data into Firebase database overwrites existing data

标签 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)
    }
}

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

任何人都可以指出正确的方向来简单地插入一条新记录吗?谢谢!

最佳答案

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

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

关于ios - swift iOS : Inserting data into Firebase database overwrites existing data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664340/

相关文章:

iphone - 如何创建一个始终串行的 GCD 队列,即使在多核 CPU 上也是如此?

swift - Firestore 搜索数组包含多个值

ios - 如何正确构建 Firebase 数据库以方便读取和删除

ios - NSLAyoutConstraints 不适用于 UICollectionViewCell 中的 UIView

ios - 在 SwiftUI 中从 @ObservedObject 获取更新的值

Android Firebase,获取节点中键的位置

android - 对 Cloud Firestore 的多次写入是否有任何限制?

ios - 如何使用类转储获取 IOHIDLib 的 header ?

ios - DropboxSDK : error deleting credentials in iOS SDK

iphone - 获取 GDataFeedPhotoAlbum 返回错误的对象类型