SwiftUI 中的@FetchRequest

Posted

技术标签:

【中文标题】SwiftUI 中的@FetchRequest【英文标题】:@FetchRequest in SwiftUI 【发布时间】: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 
    
    

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

【问题讨论】:

【参考方案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 并手动创建请求,那么它会按预期工作。

以上是关于SwiftUI 中的@FetchRequest的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中的@FetchRequest

SwiftUI:随机“调用中的额外参数”错误

如何知道 UIKit 视图控制器中的 swiftUI 事件? ||如何提供 swiftUI 和 uikit 之间的通信

SwiftUI:表单中的按钮

SwiftUI 中的记忆?

SwiftUI 中的锚点