0

私は Paul Hudson の 100 Days of SwiftUI に取り組んでおり、Project 11 で CoreData に関するイライラする問題に遭遇しました。これは、彼のビデオでコンパイルして正常に実行される Paul のコードの直接のリフトです。Bookworm.xcdatamodeld には、id という名前の UUID と name という名前の文字列という 2 つの属性を持つ Student という名前の単一のエンティティがあります。

正常にコンパイルされますが、実行すると ForEach でクラッシュが発生し、「学生」に赤の下線が引かれます。コンソールに表示されるエラー メッセージは次のとおりです。

2020-10-31 12:13:47.934507-0400 Bookworm[614:7766183] [エラー] エラー: どのモデルにも NSEntityDescriptions が NSManagedObject サブクラス 'Bookworm.Student' を要求していないため、エンティティが混乱しています。NSManagedObjectModel をロードしましたか? CoreData: エラー: どのモデルにも NSEntityDescriptions が NSManagedObject サブクラス 'Bookworm.Student' を主張していないため、エンティティが混乱しています。NSManagedObjectModel をロードしましたか? 2020-10-31 12:13:47.934651-0400 Bookworm[614:7766183] [エラー] エラー: +[Bookworm.Student entity] 管理対象オブジェクト サブクラス CoreData に対する NSEntityDescription の一意の一致が見つかりませんでした: エラー: +[ Bookworm.Student エンティティ] NSEntityDescription と管理対象オブジェクト サブクラスの一意の一致が見つかりませんでした 2020-10-31 12:13:47.953419-0400 Bookworm[614:

Xcode を単純に閉じて再度開く (ステップ 1)、プロジェクトをクリーンアップしてからステップ 1 を繰り返す、すべての派生データを削除してステップ 1 を繰り返すなど、私が見つけたすべての推奨される解決策をたくさん検索しました。確認しました。モジュールのインスペクターで現在の製品モジュールが選択されていること、および Codegen でクラス定義が選択されていること。

import SwiftUI
import CoreData

struct ContentView: View {

    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Student.entity(), sortDescriptors: []) var students: FetchedResults<Student>

    var body: some View {
        VStack {
            List {
                ForEach(students, id: \.id) { student in
                    Text(student.name ?? "Unknown")
                }
            }
        }
    }
 }
4

1 に答える 1

2

SwiftUI ライフサイクルを使用している場合は、親ビュー (またはアプリ) で NSPersistentContainer を初期化し、managedObjectContext を環境にインポートする必要があります。

あなたの場合、それは次のようなものかもしれません:

import SwiftUI
import CoreData

@main
struct coreDataParadigmApp: App {
    let persistenceController = PersistenceController.shared
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}


struct ContentView: View {
    @FetchRequest(entity: Student.entity(), sortDescriptors: []) var students: FetchedResults<Student>
    var body: some View {
        VStack {
            List {
                ForEach(students, id: \.id) { student in
                    Text(student.name ?? "Unknown")
                }
            }
        }
    }
 }

// DONT FORGET TO CHANGE THE NAME OF YOUR FILE
struct PersistenceController {
    static let shared = PersistenceController()

    let container: NSPersistentContainer

    init() {
        container = NSPersistentContainer(name: "coreDataNameOfFile")

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
}
于 2020-10-31T18:09:52.503 に答える