我正在使用SwiftUI和CoreData构建一个具有SwiftUI应用程序生命周期的小型应用程序(无场景或应用程序委托)。在运行+构建应用程序时,我收到以下错误:
'executeFetchRequest:error: A fetch request must have an entity.'
我已检查/验证/重新检查以下内容:
- 我的
[app name].xcdatamodeld
文件名与传递到NSPersistentContainerNSPersistentCloudKitContainer(name: [app name])
的文件名相同 - 实体的名称
Car
正是我传递给FetchRequest的名称
@FetchRequest(entity: Car.entity(), sortDescriptors: []) var car: FetchedResults<Car>
- 我为实体Codegen选择了Manual/None,生成的类为
public class Car: NSManagedObject {}
Car上的分机号为Identifiable
。
这是我的整个视图结构,它应该(据我的理解)将环境传递给它的所有“子”视图。
struct AppView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Car.entity(), sortDescriptors: []) var car: FetchedResults<Car>
var body: some View {
List {
ForEach(car, id:\.self) { item in
RootView(carData: item)
.environment(\.managedObjectContext, self.moc)
}
}
}
}
和my @main结构
@main
struct AutoMateApp: App {
@StateObject var coreData = PersistentCloudKitContainer()
let persistence = PersistentCloudKitContainer()
var body: some Scene {
WindowGroup {
AppView()
.environment(\.managedObjectContext, coreData.persistentContainer.viewContext)
}
}
}
当我使用调试器单步调试时,似乎在返回WindowGroup后出现了崩溃。我不确定这是否是有用的信息。
我很感激你的帮助,谢谢。
4条答案
按热度按时间flseospp1#
好的,在我的例子中,从
AppDelegate
中的lazy var persistentContainer: NSPersistentCloudKitContainer = {...}()
行中删除lazy
很有帮助。因为苹果的样板代码似乎在let contentView = ContentView().environment(\.managedObjectContext, persistentContainer.viewContext)
行中传递了NSManagedObjectModel
,FetchRequest在闭包正确示例化之前访问了该对象,因此无法找到NSManagedObject subclass
。从变量中删除lazy
会立即执行闭包。希望这仍然对你有帮助,并在你的情况下解决问题。
628mspwn2#
选中Core Data支持后,尝试SwiftUI应用程序项目模板中的代码:
我的应用程序.swift
"坚持,迅速"
deikduxw3#
将
Car.entity()
替换为静态NSEntityDescription。这些例子
cngwdvgl4#
我今天遇到了这个问题,我认为问题是在声明和排序的时候出现的。从获取请求中删除实体(这可能允许它在生命周期的稍后阶段通过类型推断来做事情)就解决了这个问题:
在设置预览时,可能会在创建和注入环境上下文之前计算
Car.entity()
。