[英]write (add) multiple array in firestore
我嘗試在 swiftui 中使用 struct codable 在 firestore 中添加多個數組,但是當我添加時,它會更新添加的相同數組,但我想在我的列表中添加更多數組...
正如您在圖片中看到的,每次我添加文本時,它都會更新我的索引“0”,但我想添加多個索引,例如 O、1、2 ... 在我的數組“標簽”中
視圖模型
class DataManager: ObservableObject {
@Published var books = Book(tags: [Tag(title: "", color: "")])
func addBookNew(nom: String, prenom: String){
//guard let userID = Auth.auth().currentUser?.uid else {return}
let db = Firestore.firestore()
let collectionRef = db.collection("Users").document("TEST")
do {
let data = Book(tags: [Tag(title: nom, color: prenom)])
try collectionRef.setData(from: data)
}
catch {
print(error)
}
}
結構書
import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
struct Book: Codable {
@DocumentID var id: String?
let tags: [Tag]
}
結構標簽
import Foundation
import FirebaseFirestoreSwift
struct Tag: Codable, Hashable {
let title: String
let color: String
}
列表顯示
import SwiftUI
import Firebase
struct ListView: View {
@StateObject var dataManager = DataManager()
@State private var showPopUp = false
@EnvironmentObject var viewModel: AppViewModel
var books: [Book]
@State var nomTF = ""
@State var prenomTF = ""
@State var dismiss = false
var body: some View {
NavigationView{
VStack{
TextField("nom", text: $nomTF )
TextField("prenom", text: $prenomTF)
Button("save") {
dataManager.addBookNew(nom: nomTF, prenom: prenomTF)
}
List{
ForEach(dataManager.books.tags, id: \.self) { book in
HStack{
Text("T: \(book.title)")
Text("C: \(book.color)")
}
}
}
}.onAppear(){
dataManager.fetchtest()
}
問題在這里:
let data = Book(tags: [Tag(title: nom, color: prenom)])
try collectionRef.setData(from: data)
此代碼告訴 Firestore 將tags
字段設置為您在調用中指定的數組。
如果要向現有數組添加唯一項,可以使用FieldValue.arrayUnion([...])
。
let data = Book(tags: FieldValue.arrayUnion([Tag(title: nom, color: prenom)]))
try collectionRef.setData(from: data)
請注意,這只會添加不在數組中的項目。 如果要允許重復項,則必須先從文檔中讀取數組,然后更新應用程序代碼,最后將整個數組寫回數據庫。
更新:您的Book
class 似乎只能在其tags
字段中接受Tag
,因此您不能在那里指定FieldValue.arrayUnion
。 然后在數據庫調用中簡單地執行聯合可能是最簡單的:
try collectionRef.updateData([
"tags": FieldValue.arrayUnion([Tag(title: nom, color: prenom)])
])
因此,我們不是在這里寫整本書,而是更新文檔中的單個字段,並在其中執行數組聯合。
washingtonRef.updateData([
"regions": FieldValue.arrayUnion(["greater_virginia"])
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.