【问题标题】:App crashes when saving a dictionary object in Firestore在 Firestore 中保存字典对象时应用程序崩溃
【发布时间】:2021-01-06 01:46:42
【问题描述】:

我试图像这样将我的测验数据保存到 Firestore 中

db.collection("Quizzes").addDocument(data: ["Author": userEmail,
                                                    "quizTitle": quizTitle,
                                                    "quizDescription": quizDescription,
                                                    "quizDictionary": quizDictionary]) { (error) in
                                                        if let e = error{
                                                            print("There was an erorr saving the data to the Firestore \(e)")
                                                        }

单击将执行此代码块的按钮后,我的应用程序崩溃并打印以下错误

020-09-19 17:17:46.367783+0800 Quizzler[18001:782362] -[__NSCFNumber 长度]:无法识别的选择器发送到实例 0xc4cd28a1a98b5156 2020-09-19 17:17:46.469546+0800 Quizzler[18001:782362] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFNumber 长度]:无法识别的选择器发送到实例 0xc4cd28a1a98b5156”

在做了一些调试后,我发现"quizDictionary": quizDictionary 部分是导致崩溃的原因。为什么会这样?我以为.addDocument(data: )这个方法接受[String: Any]

如果无法将 Dictionary 对象保存到 Firestore,有哪些解决方法?

如果需要,这是我的字典声明 dictionary declaration

【问题讨论】:

  • 我猜密钥必须是String,所以你不能有[Int: Something],但需要[String; Something]。根据错误,知道在 JSON 中它的键必须是字符串,这不会让我感到惊讶。
  • 您绝对可以将字典保存到 Firestore。了解您的数据的实际外观(在问题中!)而不是向我们展示变量会很有帮助。说明 addDocument accepts [String: Any]? 不太准确,因为 Any 必须是受支持的数据类型之一(如答案中所述)。此外,您的 Int: 是一个 CreateQuizModel object,它听起来并不像 Int(0、1、2 等)

标签: ios swift firebase dictionary google-cloud-firestore


【解决方案1】:

您可以在这里查看在 fireStore 中添加和管理数据的文档:- https://cloud.google.com/firestore/docs/manage-data/add-data#swift

快速概述行:- 使用 Map 或 Dictionary 对象来表示您的文档通常不是很方便,因此 Firestore 支持使用自定义类编写文档。 Firestore 将对象转换为支持的数据类型。

更新:- 如 cmets 中所述,它不只是将任何随机对象转换为支持的类型。如果你向它扔一个 NSImage,它就不会知道如何处理它。或者,如果对象包含其他一些随机对象,它将不起作用。它必须只包含支持的类型。您可以参考this链接了解更多支持的数据类型。

【讨论】:

  • Firestore 将对象转换为支持的数据类型 嗯,有点。请记住,它不只是将任何随机对象转换为支持的类型。如果你向它扔一个 NSImage,它就不会知道如何处理它。或者,如果对象包含其他一些随机对象,它将不起作用。它必须只包含支持的类型。
  • 是的,谢谢你,我也会更新我的答案。
【解决方案2】:

您只能使用 Firestore 读取和写入支持的数据类型:

  • 数组
  • 布尔值
  • 字节
  • Firestore 日期对象
  • 浮点数
  • Firestore 地理对象
  • 整数
  • 映射(字典,仅包含这些受支持类型的字符串键和值)
  • Firestore 参考
  • 字符串

因此,您必须将自定义对象转换为 Firestore 可识别的格式,这意味着将自定义类型替换为数据库的原始类型。

https://firebase.google.com/docs/firestore/manage-data/data-types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多