Пожарный магазин - Подколлекция Swift - PullRequest
0 голосов
/ 04 мая 2018

Итак, я пытаюсь изучить некоторые базовые функции Firestore и смотрю видео "Kilo Locos" на YouTube, объясняющее операции CRUD. Я хочу взять его метод кода и создать из него вложенные коллекции. По сути, как я могу добавить коллекцию и сделать коллекцию «Пользователь» вложенной коллекцией из этой новой коллекции. Любая помощь очень ценится, большое спасибо !!

Вот ссылка на скачивание проекта: https://kiloloco.com/courses/youtube/lectures/3944217

Служба пожарной безопасности

import Foundation
import Firebase
import FirebaseFirestore

class FIRFirestoreService {

private init() {}
static let shared = FIRFirestoreService()

func configure() {
    FirebaseApp.configure()
}

private func reference(to collectionReference: FIRCollectionReference) -> CollectionReference {
    return Firestore.firestore().collection(collectionReference.rawValue)
}

func create<T: Encodable>(for encodableObject: T, in collectionReference: FIRCollectionReference) {
    do {
        let json = try encodableObject.toJson(excluding: ["id"])
        reference(to: collectionReference).addDocument(data: json)

    } catch {
        print(error)
    }
}

func read<T: Decodable>(from collectionReference: FIRCollectionReference, returning objectType: T.Type, completion: @escaping ([T]) -> Void) {

    reference(to: collectionReference).addSnapshotListener { (snapshot, _) in

        guard let snapshot = snapshot else { return }

        do {

            var objects = [T]()
            for document in snapshot.documents {
                let object = try document.decode(as: objectType.self)
                objects.append(object)
            }

            completion(objects)

        } catch {
            print(error)
        }
    }
}

func update<T: Encodable & Identifiable>(for encodableObject: T, in collectionReference: FIRCollectionReference) {

    do {

        let json = try encodableObject.toJson(excluding: ["id"])
        guard let id = encodableObject.id else { throw MyError.encodingError }
        reference(to: collectionReference).document(id).setData(json)

    } catch {
        print(error)
    }
}

func delete<T: Identifiable>(_ identifiableObject: T, in collectionReference: FIRCollectionReference) {

    do {

        guard let id = identifiableObject.id else { throw MyError.encodingError }
        reference(to: collectionReference).document(id).delete()

    } catch {
        print(error)
    }
}

}

FIRCollectionReference

import Foundation

enum FIRCollectionReference: String {

    case users

}

Пользователь

import Foundation

protocol Identifiable {
var id: String? { get set }

}

struct User: Codable, Identifiable {
var id: String? = nil
let name: String
let details: String

init(name: String, details: String) {
    self.name = name
    self.details = details
}

}

Расширяемые расширения

import Foundation

enum MyError: Error {
case encodingError

}

extension Encodable {

func toJson(excluding keys: [String] = [String]()) throws -> [String: Any] {

    let objectData = try JSONEncoder().encode(self)
    let jsonObject = try JSONSerialization.jsonObject(with: objectData, options: [])
    guard var json = jsonObject as? [String: Any] else { throw MyError.encodingError }

    for key in keys {
        json[key] = nil
    }

    return json

}

}

Расширения снимков

import Foundation
import FirebaseFirestore

extension DocumentSnapshot {

func decode<T: Decodable>(as objectType: T.Type, includingId: Bool = true) throws  -> T {

    var documentJson = data()
    if includingId {
        documentJson!["id"] = documentID
    }

    let documentData = try JSONSerialization.data(withJSONObject: documentJson!, options: [])
    let decodedObject = try JSONDecoder().decode(objectType, from: documentData)

    return decodedObject
}

}

1 Ответ

0 голосов
/ 04 мая 2018

Структура Firestore не может иметь коллекцию как дочерние элементы других коллекций.

Ответ на ваш вопрос ( Как я могу добавить коллекцию и сделать коллекцию «Пользователь» подколлекцией из этой новой коллекции? ) - вы не можете. Вместо этого вы должны поместить документ между этими двумя коллекциями.


Прочтите это для получения дополнительной информации.

Там написано: Notice the alternating pattern of collections and documents. Your collections and documents must always follow this pattern. You cannot reference a collection in a collection or a document in a document.

...