Swift iOS - 将数据作为包含自定义模型的自定义模型添加到 Firestore

Nia*_*dle 6 ios firebase swift swift4 google-cloud-firestore

所以我有两个自定义模型类。一个是a Story,另一个是Page。Story 包含多个属性,包括一个pages.

struct Story {

var name: String
var pages: [Page]
var tags: [String]
var likes: [String]
var isPrivate: Bool

var dictionary: [String: Any] {
    return [
        "name": name,
        "pages": pages,
        "tags": tags,
        "likes": likes,
        "isPrivate": isPrivate,
    ]
}

struct Page {

let thumbnail: String
let image: String?
let video: String?

var dictionary: [String: Any] {
    return [
        "thumbnail": thumbnail,
        "image": image as Any,
        "video": video as Any
    ]
}
Run Code Online (Sandbox Code Playgroud)

当我上传到 Firebase 时,我基本上希望 pages 对象成为 Story 对象中的一个子集合。但是我对如何正确执行此操作感到困惑,以便我可以从 Firebase 响应中正确映射和解码模型。

我能想到的唯一方法是在数据库上创建一个故事,使用 ID 获取回调,然后在其中创建页面。问题是我的Story模型不会包含自定义Page模型

Big*_*uge 11

对于它的价值,任何通过谷歌在这里寻找自定义数据模型处理 + Swift + Firebase 的人都应该使用该Codable协议检查 Firebase 的这个功能。

https://firebase.google.com/docs/firestore/manage-data/add-data#custom_objects

具体来说,这使您可以访问一个setData看起来像document("LA").setData(from: city).

您应该不再需要在 Firebase v7.3+ 中进行额外的导入,这太棒了!如果您仍在使用 v6 或更早版本,则需要它。

如果您无法在代码中访问此功能,那是因为您需要import FirebaseFirestoreSwift使用 v7.0 之前的 Swift 特殊扩展。

  • firebase 文档犯了这么大的错误,我花了很长时间才弄清楚这一点,感谢您的回答,我认为他们已经用“from”参数弃用了这个用例,编写所有字典映射真是一件痛苦的事情。 (4认同)
  • 您还需要在 Podfile 中添加“pod 'FirebaseFirestoreSwift'”,或者将 Firebase 添加到项目中。 (3认同)

bso*_*sod 1

首先,您不需要写入 Firestore 来获取该文档自动生成的 ID。Firestore 自动在客户端生成 Id(它是时间戳和随机的组合)。

其次,您可能需要考虑添加一个属性来Story携带字典格式的页面数组:

struct Page {

    let thumbnail: String
    let image: String?
    let video: String?

    var dictionary: [String: Any] {
        return [
            "thumbnail": thumbnail,
            "image": image as Any,
            "video": video as Any
        ]
    }

}

struct Story {

    var name: String
    var pages: [Page]
    var pagesData: [[String: Any]] // I added this for convenience
    var tags: [String]
    var likes: [String]
    var isPrivate: Bool

    var dictionary: [String: Any] {
        return [
            "name": name,
            "pages": pages,
            "tags": tags,
            "likes": likes,
            "isPrivate": isPrivate,
        ]
    }

}
Run Code Online (Sandbox Code Playgroud)

然后正常创建页面:

let page1 = Page(thumbnail: "abc", image: nil, video: nil)
let page2 = Page(thumbnail: "xyz", image: nil, video: nil)
Run Code Online (Sandbox Code Playgroud)

创建一个故事并将页面注入其中,包括数据化版本:

let story = Story(name: "Story", pages: [page1, page2], pagesData: [page1.dictionary, page2.dictionary], tags: ["kiwi", "mango"], likes: ["x", "y"], isPrivate: false)
Run Code Online (Sandbox Code Playgroud)

使用 Firestore 生成随机标识符:

let docRef = Firestore.firestore().collection("someCollection").document()
let docId = docRef.documentID
Run Code Online (Sandbox Code Playgroud)

如果您需要共享标识符,现在可以在写入 Firestore 之前将此标识符注入到每个对象中。

创建将写入 Firestore 的数据对象:

let data: [String: Any] = [

    "name": story.name,
    "pages": story.pagesData
    // etc

]
Run Code Online (Sandbox Code Playgroud)

在后端,该pages字段将是一个地图数组。

然后只需将数据写入Firestore:

docRef.setData(data) { (error) in

    if let error = error {
        print(" \(error)")
    } else {
        print("")
    }

}
Run Code Online (Sandbox Code Playgroud)