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的主要内容,如果未能解决你的问题,请参考以下文章