如何使用 SwiftUI 将值数组写入 Firestore

Posted

技术标签:

【中文标题】如何使用 SwiftUI 将值数组写入 Firestore【英文标题】:How to write an array of values to Firestore with SwiftUI 【发布时间】:2020-12-10 04:51:46 【问题描述】:

目前我有一个从“项目”集合中获取“项目”列表的屏幕。用户应该能够选择多个项目,并在按下按钮时将它们添加到“电影”集合中的文档中。我似乎无法弄清楚如何编写将这些项目列表写入电影文档的函数。

下面的代码示例

这是获取项目的循环(目前工作)

    let movie: Movie
    @State var selections: [String] = []
    @ObservedObject private var viewModel = ItemsViewModel()
    @State private var isSelected = false
    @State var movieID = ""
    
    var body: some View 

                    VStack 
                        ForEach(viewModel.items.indices, id: \.self)  i in
                            Button(action:  viewModel.items[i].isSelected.toggle() ) 
                                HStack 
                                    if viewModel.items[i].isSelected 
                                        Text(viewModel.items[i].name)
                                            .foregroundColor(.white)
                                            .font(.system(size: 16, weight: .bold))
                                        
                                        Spacer()
                                        Image(systemName: "checkmark")
                                            .foregroundColor(ColourManager.pinkColour)
                                            .font(.system(size: 16))
                                     else 
                                        Text(viewModel.items[i].name)
                                            .foregroundColor(Color(.systemGray))
                                            .font(.system(size: 16))
                                        Spacer()
                                    
                                
                                .padding(.vertical, 10)
                                .padding(.horizontal)
                            
                            Divider()
                        
                    
                    .onAppear() 
                        self.viewModel.fetchData()
                    

按钮调用函数

Button(action:  self.addItems() ) 
HStack 
    Text("Add Selected Items")

写入 Firestore 的函数

func addItems() 
        let db = Firestore.firestore()
        db.collection("movies").document(self.movieID).setData(["item": [self.selections]])
    

我希望 Firestore 数据库看起来像:

 
movieID: 12345, 
movieName: "Goodfellas", 
items: [ 
      item: "item 1",
      item: "item 2"
        ]

到目前为止,我的movieID 和movieName 都在工作,只是不知道如何记录选择并将它们写为项目。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

答案取决于您希望 items 字段的类型。您要存储的信息可以存储为字符串数组或对象文字。使用 JSON:

// Array of String
items: ["item1", "item2"]

// Object Lieral
items: 
  "key1": "item1",
  "key2": "item2"

从发布的代码中,变量 selections 已经是一个字符串数组,所以第一个选项很简单:

db.collection("movies").document(self.movieID).setData(["item": self.selections])

至于第二个,请记住对象文字的键必须是唯一的,因此您需要以某种方式为每个项目派生这些键,构造对象并将其添加为文档项键的值。有关在 Swift 中添加数据的更多参考,请查看documentation

【讨论】:

我正在尝试字符串数组,除了推送到 Firebase 之外,我让它正常工作。该部分有效,并将以您在上面编写的格式打印到控制台,但是当我实现将其推送到 Firestore 的功能时,它会运行,但是当我做出选择并按下确认按钮时,它崩溃并且我收到错误 @ 987654324@ @SeanForReal 根据文档,用于推送到 Firestore 的语法是正确的。我建议检查 self.movieID 是否实际上返回了一个有效的标识符(不是 null,没有正斜杠等),因为这可能是原因。 哦,非常感谢您指出这一点。试图在按下按钮时打印self.movieID,发现它什么也没返回,然后在那个屏幕上意识到我将movieID设置为字符串,所以只需将其更改为"\(self.movieid)",现在一切正常并推送到db正是我想要的。谢谢!

以上是关于如何使用 SwiftUI 将值数组写入 Firestore的主要内容,如果未能解决你的问题,请参考以下文章

带有使用数组字典的部分的 SwiftUI 列表

如何使用方法写入通用数组?指定类型后,通用数组不会更改数据类型

如何将二维数组写入文本文件?

SwiftUI 将值从几何阅读器传递给函数

Firestore 将值添加到数组字段

如何更快地将值写入访问数据库 - VBA(excel)