[英]Initialize Core Data SwiftUI
我正在尝试启动数据,因此当用户第一次安装应用程序时,它会有一些数据。 初始化不工作,但为什么?
对于 Core Data 上的 CRUD 操作,我使用了一个xcdatamodeld
文件,该文件带有一个名为ProgrammingLanguage
的实体,该实体具有两个字符串属性:“name”和“creator”。 这是代码:
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: ProgrammingLanguage.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \ProgrammingLanguage.name, ascending: true),
]
) var languages: FetchedResults<ProgrammingLanguage>
init() {
let language = ProgrammingLanguage(context: self.managedObjectContext)
language.name = "SwiftUI"
language.creator = "Some text"
do {
try self.managedObjectContext.save()
} catch {
}
}
var body: some View {
NavigationView {
List {
ForEach(languages, id: \.self) { language in
Button(action: {
}) {
Text("Creator: \(language.creator ?? "Anonymous")")
}
}
}
}
}
}
就好像它没有保存它一样。 这里发生了什么? 该初始化应该在数据库上创建数据,我将能够在视图上读取它......
喜欢看到 SwiftUI,所以您似乎需要添加一个 fetch 请求,它会为您带来您正在寻找的 coreData object 数组。
在您的@Environment 正下方添加此属性:
@FetchRequest(entity: ProgrammingLanguage.entity(), sortDescriptors: []) var languages: FetchedResults<ProgrammingLanguage>
然后你可以以任何你想要的方式呈现它
希望它有所帮助,如果你想看的话,Paul Hudson 有一个关于 CoreData 和 SwiftUI 的很棒的教程
我建议使用.onAppear()
修饰符来做到这一点。 在您的代码示例中,它将是:
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: ProgrammingLanguage.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \ProgrammingLanguage.name, ascending: true),
]
) var languages: FetchedResults<ProgrammingLanguage>
var body: some View {
NavigationView {
List {
ForEach(languages, id: \.self) { language in
Button(action: {
}) {
Text("Creator: \(language.creator ?? "Anonymous")")
}
}
}.onAppear() {
let language = ProgrammingLanguage(context: self.managedObjectContext)
language.name = "SwiftUI"
language.creator = "Some text"
do {
try self.managedObjectContext.save()
} catch let error {
print(error)
}
}
}
}
}
希望这会有所帮助:我在这里找到了解决方案: Apple Developer Forum
我有一个类似的问题。 我尝试了 .onAppear 的想法,但这对我不起作用,因为在我的 Content View 版本中,有一些语句需要非空核心数据——它需要像 UIKit viewWillAppear 这样的东西,以便加载数据在运行任何 ContentView 之前,which.onAppear 似乎不这样做。 我确实通过调用另一个结构以另一种方式解决了这个问题,该结构首先检查核心数据是否被实例化,必要时为数据播种,然后调用预期的 ContentView,但这似乎是一个真正的初始化问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.