【问题标题】:How can I save a dictionary to Firebase in swift?如何快速将字典保存到 Firebase?
【发布时间】:2020-03-08 02:58:41
【问题描述】:

我有一本 [Int: Int] 类型的字典,我正试图将其保存到 firebase。我写入 firebase 的函数如下所示:

func writeToFirebase() {
    setScoreToBadge()
    setScoreToVehicle()
    if GameManager.instance.getUsername() != "" {
        self.ref?.child("user").child(
                GameManager.instance.getUsername()
        ).setValue(
            [
                "email": GameManager.instance.getEmail(),
                 "userNameLowered": GameManager.instance.getUsername().lowercased(),
                 "userName": GameManager.instance.getUsername(),
                 "topScore": GameManager.instance.getTopScores()[0],
                 "topScores": GameManager.instance.getTopScores(),
                 "totalCash": GameManager.instance.getTotalCash(),
                 "friends": GameManager.instance.getFriendsAdded(),
                 "achievements": GameManager.instance.getAchievementsCompletedBool(),
                 "badge": GameManager.instance.getBadgeLevel(),
                 "scoreBadgeDictionary" : GameManager.instance.getTopScoreWithBadgeDictionary(),
                 "scoreVehicleDictionary" : GameManager.instance.getTopScoreWithVehicleDictionary()
            ])
    } else {
        print ("Not signed in, score not saved to firebase")
    }
}

我遇到的问题是scoreBadgeDictionary, scoreVehiceDictionaryGameManager.instance.getTopScoreWithBadgeDictionary()[Int: Int] 类型的字典,GameManager.instance.getTopScoreWithVehicleDictionary()[Int: String] 类型的字典。如果我尝试运行此功能,它将崩溃。

有没有办法将字典转换为我可以保存到 firebase 的格式?

【问题讨论】:

  • 如果发生崩溃,请编辑您的问题以包含确切的错误消息和堆栈跟踪。
  • 简短的回答是 Firebase 键必须是字符串,但 Firebase 中的数组具有数字索引除外。话虽如此,带有数字键的字典的用例是什么?

标签: swift firebase dictionary firebase-realtime-database


【解决方案1】:

这个问题是如何定义数组。一个简单的例子

let myArray = ["some_key": "some_value"]

被定义为 [String: String] 的数组

let myArray = ["some_key": 5]

被定义为 [String: Int] 的数组

你的数组是

[
"email": GameManager.instance.getEmail(),
"userNameLowered": GameManager.instance.getUsername().lowercased(),
.
.
"scoreBadgeDictionary" : ["some key": "some value"]
]

我假设 GameManager.instance.getTopScoreWithBadgeDictionary() 返回一个字典。

因此该数组不符合 [String: String] 或 [String: Int]。但是,它确实符合更通用的 [String: Any],因此您需要“告诉” var。

let myArray: [String: Any] = [
     "email": "Hello",
     "userNameLowered": "hello",
     "scoreBadgeDictionary" : [1: "some score"],
     "scoreVehicleDictionary" : [2: "some vehicle"]
]

但是,这是重要的一点,getTopScoreWithVehicleDictionary 返回的字典是 [Int: String] 或 [Int: Int] 不适用于 Firebase。

Firebase 键必须是字符串,因此尝试编写此 [1: "Hello, World] 会崩溃。注意 Firebase 中的数组具有数字索引和

如果数据看起来像一个数组,Firebase 会将其呈现为一个数组。

我建议重新考虑该结构 - 可能将 Int 转换为字符串是一种选择,但这可能不适用于您的用例。

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2015-07-07
    • 2015-06-25
    相关资源
    最近更新 更多