如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章