在 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章

未收到 Flutter FCM IOS 静默(仅数据)通知

AES 加密在 iOS 13.4 上无法正常工作

在其他平台上使用 iOS GameKit 的“Bluetooth Bonjour”

FIREBASE 数据库 - 将唯一密钥存储到子节点(Swift/IOS)

Tyk.io - 尝试使用无效或丢失密钥进行管理访问

Firebase Cloud Messaging 通知未显示在 iOS 设备上(前台和后台)