簡體   English   中英

iOS 14 Beta - Swift UI 中的核心數據錯誤:任何 model 中沒有 NSEntityDescriptions 聲明 NSManagedObject 子類

[英]iOS 14 Beta - Core Data in Swift UI Error: No NSEntityDescriptions in any model claim the NSManagedObject subclass

我正在使用新的 SwiftUI App 協議並通過 @Environment 傳遞我的核心數據 NSPersistentContainer:

        final class PersistentStore: ObservableObject {
            static let shared = PersistentStore()
            let persistentContainer: NSPersistentContainer
            private init() {
                    self.persistentContainer = {
                        let container = NSPersistentContainer(name: "SillyModel")
                        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
                            if let error = error as NSError? {
                                fatalError("Unresolved error \(error), \(error.userInfo)")
                            }
                        })
                        return container
                    }()
            }
            func saveContext() {
                let context = persistentContainer.viewContext
                if context.hasChanges {
                    do {
                        try context.save()
                    } catch {
                        let nserror = error as NSError
                        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                    }
                }
            }
    }

    
    @main
    struct SillyApp: App {
        
        @Environment(\.scenePhase) private var scenePhase
        
        var body: some Scene {
            WindowGroup {
                NavigationView {
                    ProjectGridView()
                }
                .environment(\.managedObjectContext, PersistentStore.shared.persistentContainer.viewContext)
            }
        }
}

然后我在 ProjectGridView 中使用 @Enviroment 從環境中獲取 managedObjectContect,嘗試 @FetchRequest 並顯示一個新的 LazyVGrid:

struct ProjectGridView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(
      entity: Project.entity(),
      sortDescriptors: [
        NSSortDescriptor(keyPath: \Project.title, ascending: true)
      ]
    ) var projects: FetchedResults<Project>
    
    let columns = [GridItem(.adaptive(minimum: 80.0))]
    
    var body: some View {
        return ScrollView {
            LazyVGrid(columns: columns, spacing: 20) {
                ForEach(projects, id:\.title) { (project: Project) in
                    Text("\(project.title ?? "")")
                }
            }
            .padding(.horizontal)
        }
    }
} 

我收到此錯誤:

[error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'Project' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?

我嘗試編寫代碼來保存新的 Project(),甚至讓 @FetchRequest 在其他地方工作。 我猜這可能與 LazyVGrid 的“懶惰”部分有關? 有任何想法嗎?

好的,從 Apple Developer 論壇中找到了一個修復程序。 這似乎只是一個測試版錯誤:

要修復,請為您的 model class 創建一個擴展:

import Foundation
import CoreData

extension Project {
    class func swiftUIFetchRequest() -> NSFetchRequest<Project> {
        let request = NSFetchRequest<Project>(entityName: "Project")
        request.sortDescriptors = [NSSortDescriptor(keyPath: \Project.title, ascending: true)] /* You can add custom sort descriptors here */
        return request
    }
}

然后像這樣調用@FetchRequest:

@FetchRequest(fetchRequest: Project.swiftUIFetchRequest()) var projects: FetchedResults<Project>

感謝 Apple Developer 論壇中發現這一點的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM