#swift #firebase #google-cloud-firestore
#swift #firebase #google-cloud-firestore
Вопрос:
В этом первом примере он компилируется и работает должным образом, возвращая все документы проекта.
public struct Project: Codable, Identifiable, Equatable {
@DocumentID public var id : String? = UUID().uuidString
public var name: String
public var password: String
}
public static func testQuery() async -> [Project] {
let db = Firestore.firestore()
let ref = db.collection("Project")
let snapshot = try? await ref.getDocuments()
if let snapshot = snapshot {
return snapshot.documents.compactMap { document in
return try? document.data(as: Project.self)
}
} else {
return [Project]()
}
}
Однако, если я изменю ссылку, которая будет объявлена как запрос, документы больше не поддерживают codable. Как я могу это исправить, поскольку мне нужно использовать Query для динамического создания запроса на основе переданных параметров.
public static func testQuery() async -> [Project] {
let db = Firestore.firestore()
let ref: Query = db.collection("Project") // this line changed
let snapshot = try? await ref.getDocuments()
if let snapshot = snapshot {
return snapshot.documents.compactMap { document in
return try? document.data(as: Project.self). // this no longer compiles
}
} else {
return [Project]()
}
}
Комментарии:
1. Откуда взялся специалист по запросам? Проект? Я никогда о нем не слышал.
2. Вы проверили это подробное руководство ?
3. Да, проблема заключается в использовании запроса. Причина, по которой мне нужно объявить ref как запрос, заключается в том, что мне нужно программно
.whereField
обрабатывать конструкции на основе входных данных, а не знать их во время компиляции. Запрос успешно создается и успешно возвращает документы, однако эти документы по какой-либо причине не поддаются декодированию (кажется, что они должны быть). Возможно, это ошибка в поддержке Firestore Swift4. Что происходит при переходе
let ref: Query = db.collection("Project")
наlet ref: Query = db.collection("Project").whereField(addSomethingThatYouKnowWillReturnADocument)
? Значит, это работает?5. к сожалению, та же проблема
Ответ №1:
Оказывается, что если вы приведете ссылку из Query в CollectionReference, вы можете использовать встроенные функции кодирования и декодирования.
public static func testQuery() async -> [Project] {
let db = Firestore.firestore()
let ref: Query = db.collection("Project") // this line changed
let ref2 = ref as! CollectionReference
let snapshot = try? await ref2.getDocuments()
if let snapshot = snapshot {
return snapshot.documents.compactMap { document in
return try? document.data(as: Project.self). // this no longer compiles
}
} else {
return [Project]()
}
}