繁体   English   中英

初始化核心数据 SwiftUI

[英]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 的很棒的教程

https://www.hackingwithswift.com/100/swiftui/57

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM