如何在Swift中写给Firebase Ref的最后一个孩子



我在以期望的方式将数据写入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父键。

最新更新