【发布时间】:2016-12-31 02:47:09
【问题描述】:
我正在努力以所需的方式将数据写入 Firebase。
情况:我想为每个用户存储多个“行程”。每个“行程”都包含带有纬度、经度、高度和时间戳的位置。 在某些条件下,我想在最近的“旅行”中添加一个新位置。
数据结构如下:
- root
-- users
--- userID
---- trips
------ trip1
------- location
------ trip2
------- location
将位置添加到最近一次旅行(在本例中为trip2)的最佳方式是什么?
我曾希望类似的事情是可能的:
func setupFirebase() {
ref = FIRDatabase.database().reference()
userRef = ref.child("users")
userID = FIRAuth.auth()?.currentUser?.uid
tripsRef = self.userRef.child(userID!).child("trips")
currentTripRef = tripsRef.queryLimited(toLast: 1)
}
然后我可以简单地去:
currentTripRef.child(dateString).setValue([
"timestamp": dateString,
"lat": lat,
"lng": lng,
"alt": alt
])
无论我需要在哪里写东西。这显然不是正确的方法,但我似乎无法弄清楚正确的方法是什么。
我想我可以观察我的tripsRef,获取一个键数组,然后在该观察函数内部使用最后一个键写入子参考。但这听起来一点效率都没有。
对此有什么解决办法吗? 提前致谢!
【问题讨论】:
-
为什么这看起来不正确?
-
您没有从 .queryLimited(toLast: 1) 获得 Firebase Ref,因为此属性返回的是查询,而不是 ref。
-
我完全错过了
observeEventType不在那里 :(!你为什么不使用observeEventType获得 currentTripRef 的值?这会给你最后一个对象,在这种情况下 trip2。而在snapshot中,只需通过迭代快照子项(在本例中只有一个对象)并使用childSnapshot.key获取密钥来访问值?所以你现在有了trip2 键,您可以只更新该节点的值! -
这与我的想法很接近。我将发布一个带有工作解决方案的答案,以讨论优化潜力。你介意看看吗?
标签: ios swift firebase firebase-realtime-database