如何在Swift中写入Firebase文档的最后一个孩子?
我正在努力以所需的方式将数据写入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 ])
无论我需要写什么东西。 这显然不是正确的做法,但我似乎无法弄清楚正确的做法。
我想我可以观察我的tripRef,得到一个数组键,并在该观察function写入最后一个关键的子ref。 但是这听起来并不高效。
任何解决scheme? 提前致谢!
首先,请记住,最好的做法是将您的节点名称与您的数据分离。 你可能会这样做,但是要强调这一点。
这是一个处理用户和旅行的build议结构
root users uid_0 name: "Jamie" uid_1 name: "Adam" trips -Yijaisioaooisd user_id: "uid_0" trip_number: 1 trip_name: "France" locations -Yuijiaissso location_name: "Bordeaux" stop_number: 1 -Yijs9ojnas9 location_name: "Burgundy" stop_number: 2 -Yijispoais location_name: "Châteauneuf-du-Pape" stop_number: 3
如果你想添加另一个站点/位置uid_0的法国之旅,裁判是
let locationsRef = rootRef.child("trips").child("-Yijaisioaooisd").child("locations")
接着
let anotherLocationRef = locationsRef.childByAutoId() let stopDict = ["location_name": "Médoc", "stop_number": 4] locationsRef.setValue(stopDict)
也就是说,可能会出现一些情况,希望对数据进行非规范化处理,并将位置分散(查询等)
所以那将是
locations trip_id: "-Yijaisioaooisd" locations: -Yuijiaissso location_name: "Bordeaux" stop_number: 1 -Yijs9ojnas9 location_name: "Burgundy" stop_number: 2 -Yijispoais location_name: "Châteauneuf-du-Pape" stop_number: 3
基于评论,添加一些额外的信息:
如果你想添加另一个停止uid_0的最新旅程有几个选项,实际的答案将取决于数据的结构。
使用queryLimitedToLast,可以查询位置节点中的最后一站,以获取站号(在上面的例子中为3)到可以递增的位置,然后写出下一站。 这将工作,如果你知道父键 – Yijaisioaooisd作为裁判将-Yijaisioaooisd /位置。
如果你不知道父键,你可以很容易地得到它与在uid_0等于user_id旅行节点的查询。 这将返回一个快照。 然后snapshot.key会提供-Yijaisioaooisd父键。