我在以期望的方式将数据写入Firebase。
情况:我想为每个用户存储多个"旅行"。每个"旅行"都包含LAT,长,高度和时间戳的位置。在某些情况下,我想为最近的"旅行"添加一个新位置。
数据结构如下:
- 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,获取一系列键,并且在观察功能的内部用最后的键写给孩子ref。但这听起来根本没有效率。
对此有任何解决方案吗?预先感谢!
首先,请记住,将您的节点名称与数据分离是最好的做法。您可能正在这样做,但想强调这一点。
这是一个处理用户及其旅行的建议结构
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个)获取到可以递增的位置,然后写出下一站。如果您知道parent键-yijaisioaooisd为裁判是-yijaisioaooisd/locations。
如果您不知道父键,则可以在user_id的旅行节点上轻松获取与UID_0相等的查询。那将返回快照。然后snapshot.key将提供-yijaisioaooisd父键。