我正在使用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
保留在直到第二天。我怀疑由于该函数正在推送两个更新,因此第一个更新将替换现有节点。
有什么想法吗?
答案 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)