gpt4 book ai didi

swift - 将两个 Cloud Firestore 集合查询到 1 个对象中

转载 作者:行者123 更新时间:2023-11-28 05:39:09 24 4
gpt4 key购买 nike

我使用 Flamelink 作为与 Firebase 集成的 headless CMS。我的所有字符串字段都工作正常;我只是在获取已上传到 Firebase Storage 的媒体的 URL 时遇到了一些问题。

我从中获取字符串字段的集合是 fl_content这些字段是:

string1
string2
imageUpload

在 Firebase 中,我可以看到从 Flamelink 保存的数据:

string1: "Titanium Tee"
string2: "Lower your handicap by 50 with premium Titanium golf tees!"

imageUpload 返回一个数组,其中包含对 fl_files(Firebase 中的不同集合)的引用

imageUpload:
0 fl_files/ZqVeXI3vX0rFDuJVDzuR

在 fl_files > ZqVeXI3vX0rFDuJVDzuR 下,我可以看到我上传的图像的完整文件名; fl_files 中的文档有一个 file 字段。 我需要将此文件名发送到我的对象,以便我能够在 UI 中使用图像。

这是我的进展:

任务:

struct Task{
var string1:String
var string2:String
//var imageUpload:String
var counter:Int
var id: String

var dictionary: [String: Any] {
return [
"string1": string1,
"string2": string2,
//"imageUpload": imageUpload,
"counter": counter
]
}
}

extension Task{
init?(dictionary: [String : Any], id: String) {
guard let string1 = dictionary["string1"] as? String,
let string2 = dictionary["string2"] as? String,
//let imageUpload = dictionary["imageUpload"] as? String,
let counter = dictionary["counter"] as? Int
else { return nil }

self.init(string1:string1, string2: string2, /*imageUpload: imageUpload,*/ counter: counter, id: id)
}
}

风险投资:

private var documents: [DocumentSnapshot] = []
public var tasks: [Task] = []
private var listener : ListenerRegistration!

fileprivate func baseQuery() -> Query {
return Firestore.firestore().collection("fl_content").limit(to: 50)
}

fileprivate var query: Query? {
didSet {
if let listener = listener {
listener.remove()
}
}
}

override func viewDidLoad() {
super.viewDidLoad()
self.query = baseQuery()
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.listener.remove()
}


override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
listenerStuff()
}

func listenerStuff(){
self.listener = query?.addSnapshotListener { (documents, error) in
guard let snapshot = documents else {
print("Error fetching documents results: \(error!)")
return
}

let results = snapshot.documents.map { (document) -> Task in
if let task = Task(dictionary: document.data(), id: document.documentID) {
return task
}
else {
fatalError("Unable to initialize type \(Task.self) with dictionary \(document.data())")
}
}

self.tasks = results
self.documents = snapshot.documents

self.databaseTableView.reloadData()

}
}

如何查询 fl_files,以便可以使用上传图像的 URL 填充 Task 的 imageUpload 属性?我需要再做一个单独的查询吗?或者我可以从 baseQuery() 访问 fl_files 吗?

编辑

这是我从 fl_content 获取 fl_files 的尝试。尝试从 Firebase 简单地填充 2 个文本字段和一个图像字段(在 UITableViewCell 中)。 getdocument 中需要的是 property 吗?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "databaseCellID", for: indexPath) as! DatabaseTableViewCell
let item = tasks[indexPath.row]

cell.label1.text = item.string1
cell.label2.text = item.string2
let docRef = Firestore.firestore().collection("fl_content").document(item.id)
print("PARENT \(docRef.parent)")
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let property = document.get("imageUpload")
// TODO - use this property to get to fl_files?
print("Document data: \(property!)")
}
}
}

最佳答案

您将需要执行单独的查询。 Firestore 中没有类似 SQL 的联接操作,并且不会自动遵循引用。

关于swift - 将两个 Cloud Firestore 集合查询到 1 个对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com