在iOS上使用基于时间的密钥更新firebase数据库

时间:2018-03-17 18:34:31

标签: ios swift firebase firebase-realtime-database

我正在使用Firebase和iOS在过去24小时内保留整数值的时间序列。我尝试过使用文档中的.updateChildValues().setValue(),但还没有弄清楚如何防止firebase覆盖每个子值,而不仅仅是使用相同键的子值。

func writeStepsPost(withUserID userID: String, steps: NSNumber) {
    let timeStamp = NSDate().timeIntervalSince1970 as NSNumber
    let post_user: NSString = userID as NSString
    let value: NSNumber = steps

    let post = ["uid": post_user,
                "steps": value,
                "lastUpdate":timeStamp]
    let childUpdates = ["/posts-steps-user/\(userID)/": post]
    ref.updateChildValues(childUpdates)
    let currentHour = Calendar.current.component(.hour, from: Date())
    let hourlyPost = ["steps":value]
    let dailyUpdates = ["/posts-steps-user/\(userID)/pastDay/\(currentHour):00/": hourlyPost]
    print("posting hourly steps update")
    ref.updateChildValues(dailyUpdates)

当时间从10变为11时,'10:00':123的节点被'11:00':243替换,当我需要为11添加节点,同时将10保留在直到第二天。我怀疑由于该函数正在推送两个更新,因此第一个更新将替换现有节点。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

给定/posts-steps-user/\(userID)/之类的单一关键路径,updateChildValues仅更新第一个子级别的数据,并且超出第一个子级别传递的任何数据都被视为setValue操作。多路径行为允许使用更长的路径而不覆盖数据。在Firebase Documentation中记录得非常好。

我已经对您的代码进行了以下调整测试,我为您的第一个updateChildValues定义了多个路径,因此它不会覆盖您的pastDay并且它正常运行。

let childUpdatePath = "/posts-steps-user/\(userID)/"
ref.updateChildValues([
            "\(childUpdatePath)/uid": post_user,
            "\(childUpdatePath)/steps": value,
            "\(childUpdatePath)/lastUpdate": timeStamp
            ])
let currentHour = Calendar.current.component(.hour, from: Date())
let hourlyPost = ["steps":value]
let dailyUpdates = ["/posts-steps-user/\(userID)/pastDay/\(currentHour):00/": hourlyPost]
ref.updateChildValues(dailyUpdates)