设置值 Firebase - Swift 3

Posted

技术标签:

【中文标题】设置值 Firebase - Swift 3【英文标题】:Setting Value Firebase - Swift 3 【发布时间】:2016-09-19 06:56:58 【问题描述】:

我在使用 Swift 3 和 Firebase 时遇到了一些问题。 我的错误是Thread 1 Signal SIGABRT. 我的错误是这样的:

Terminating app due to uncaught exception 'InvalidFirebaseData', reason: '(setValue:) Cannot store object of type _SwiftValue at book_key. Can only store objects of type NSNumber, NSString, NSDictionary, and NSArray.'

我的代码是这样的:

var book_key, book_title, book_authors, book_publisher, number_pages, book_price, book_urlPicture1, book_urlPicture2, book_condition: String!

 var ref = FIRDatabase.database().reference().child("Books").child("User's books")
        book_key = ref.childByAutoId().key


let valuesBook: NSDictionary = ["book_key": book_key, "book_title": book_title, "book_author": book_authors, "book_price": book_price, "book_publisher": book_publisher, "page_count": number_pages, "book_description": "", "book_urlImage": book_urlPicture1, "book_urlImage2": book_urlPicture2, "book_condition": book_condition]

 ref.child(book_key).setValue(valuesBook)

如果我在我的应用程序中打印我的 valuesBook,结果是绝对正确的。像这样:


"book_author" = Gg;
"book_condition" = "Very Good";
"book_description" = "";
"book_key" = "-KS0DIr6cQkI0oxsgwPU";
"book_price" = 3;
"book_publisher" = Jj;
"book_title" = Gg;
"book_urlImage" = "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/book_key%2F-KS0DIr6cQkI0oxsgwPUfirstImage.jpg?alt=media&token=231324bd-5b3a-4e3e-935f-2f1177da404a";
"book_urlImage2" = "https://firebasestorage.googleapis.com/v0/b/loginsample-myapp.appspot.com/o/book_key%2F-KS0DIr6cQkI0oxsgwPUsecondImage.jpg?alt=media&token=cc207ba4-46a6-4552-a65c-13ef7c4df5ee";
"page_count" = 5;


结果保存在我的数据库中,但应用程序崩溃了。 在swift 3之前我没有任何错误。有什么想法吗? 提前谢谢你

【问题讨论】:

【参考方案1】:

当您的字典中有 Optionals 时,这似乎发生在 swift 3 中,尝试将变量声明为 String,初始值为空字符串而不是 String!,像这样

var book_key = "", book_title = "", book_authors = "", book_publisher = "", number_pages = "", book_price = "", book_urlPicture1 = "", book_urlPicture2 = "", book_condition = ""

【讨论】:

【参考方案2】:

感谢您的帮助。我找到了解决方案。 现在我正在使用这个:

let valuesBook = ["book_key": book_key, "book_title": book_title, "book_author": book_authors, "book_price": book_price, "book_publisher": book_publisher, "page_count": number_pages, "book_description": "", "book_urlImage": book_urlPicture1, "book_urlImage2": book_urlPicture2, "book_condition": book_condition] as [String: Any]

而不是这个:

let valuesBook: NSDictionary = ["book_key": book_key, "book_title": book_title, "book_author": book_authors, "book_price": book_price, "book_publisher": book_publisher, "page_count": number_pages, "book_description": "", "book_urlImage": book_urlPicture1, "book_urlImage2": book_urlPicture2, "book_condition": book_condition]

【讨论】:

是的,这也有效,但要小心,如果这些变量中的任何一个为 nil,您的程序将在这一行崩溃 在大多数情况下最好避免隐式展开可选。

以上是关于设置值 Firebase - Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 3 调试 Firebase

根据特定值查询子节点(Swift 3、Firebase)

在 Swift 中使用 Firebase 获取值属性

无法在getDocuments querysnapshot(Swift)中将变量分配给Firebase数据[重复]

Swift 3 + Firebase:检查数组内的值是不是存在?

Swift方法中的Firebase“找不到成员:值”