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