【问题标题】:@FetchRequest in SwiftUISwiftUI 中的@FetchRequest
【发布时间】:2021-03-24 02:43:48
【问题描述】:

在使用 Core Data 运行我的 SwiftUI 应用程序时,我不断收到以下错误。

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

在我的 MovieAppApp 文件中,我有以下代码。

 var body: some Scene {
        WindowGroup {
            MoviesScreen().environment(\.managedObjectContext, CoreDataManager.shared.viewContext)
        }
    }

最后,在 MoviesScreen 中,我使用了@FetchRequest,如下所示:

struct MoviesScreen: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @FetchRequest(entity: Movie.entity(), sortDescriptors: [NSSortDescriptor(key: "title", ascending: true)])
    var movies: FetchedResults<Movie>
    
    var body: some View {
        List(movies, id: \.self) { movie in
            Text(movie.title ?? "")
        }
    }
}

CoreDataManager 如下图所示:

class CoreDataManager {
    
    let persistentContainer: NSPersistentContainer
    
    static let shared = CoreDataManager()
    
    private init() {
        
        persistentContainer = NSPersistentContainer(name: "MovieAppModel")
        persistentContainer.loadPersistentStores { (description, error) in
            if let error = error {
                fatalError("Failed to initialize Core Data \(error)")
            }
        }
        
        let directories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        print(directories[0])
    }
    
    var viewContext: NSManagedObjectContext {
        return persistentContainer.viewContext 
    }
    
}

为什么我总是收到错误消息?

【问题讨论】:

    标签: core-data swiftui


    【解决方案1】:

    您应该从 main 包中获取您的 模型,并将其传递给 NSPersistentContainer 初始化程序。

    试试下面的代码:

    class DataControllers:ObservableObject{
       
        let container: NSPersistentContainer
        
        init(inMemory:Bool = false) {
           
            container = NSPersistentContainer(name: "Main", managedObjectModel: DataController.model)
            
            if inMemory{
                container.persistentStoreDescriptions.first?.url = URL(fileURLWithPath: "/dev/null")
            }
            
           
            container.loadPersistentStores { (storeDescription, error) in
                if let error = error{
                    fatalError("fatal error loading data:\(error.localizedDescription)")
                }
               
            }
        }
        
        static let model: NSManagedObjectModel = {
            guard let url = Bundle.main.url(forResource: "Main", withExtension: "momd") else{
                fatalError("Failed to locate model file.")
            }
            
            guard let managedObjectModel = NSManagedObjectModel(contentsOf: url) else {
                fatalError("Failed to load model file.")
            }
            
            return managedObjectModel
        }()
    }
    

    【讨论】:

    • 奇怪的是,如果我使用完全相同的代码而不使用 @NSFetchRequest 并手动创建请求,那么它会按预期工作。
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 2020-06-16
    • 2020-04-17
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多