在 iOS 上使用基于时间的密钥更新 firebase 数据库
Posted
技术标签:
【中文标题】在 iOS 上使用基于时间的密钥更新 firebase 数据库【英文标题】:Update firebase database with time-based key on iOS 【发布时间】:2018-03-17 18:34:30 【问题描述】:我正在使用 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
保留到第二天。我怀疑由于该功能正在推送两个更新,因此第一个更新会替换现有节点。
有什么想法吗?
【问题讨论】:
我尝试使用此代码并得到一个类似userID/pastDay/10:00:123
的节点,接下来的一个小时,我得到了userID/pastDay/11:00:234
。它没有覆盖第一个,而是创建了一个新的。您如何在 timedRef.setValue(value)
命令中定义 value
?我不明白您是如何获得 10:123
而不是 10:00:(some-value)
的,因为您在 timedRef 路径中确实有 :00。
@ParrettApps 我在 OP 中说错了,我已经对其进行了编辑以使其更加清晰。
@ParrettApps Firebase 似乎正在替换 pastDay
节点,该节点正在删除其所有子节点。
【参考方案1】:
给定一个像/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)
【讨论】:
它在同一函数中更早地更新父节点。我怀疑这是问题的一部分。我会将该代码添加到 OP 中。 我已根据您提供的附加代码调整了答案。以上是关于在 iOS 上使用基于时间的密钥更新 firebase 数据库的主要内容,如果未能解决你的问题,请参考以下文章
在其他平台上使用 iOS GameKit 的“Bluetooth Bonjour”