簡體   English   中英

在 firestore 中寫入(添加)多個數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM