CoreData报错:fetch请求必须包含实体(SwiftUI Xcode项目)
CoreData报错:"executeFetchRequest:error: A fetch request must have an entity."
问题描述
在SwiftUI的Xcode项目(应用名Dart Tools)中使用CoreData,已创建Player实体,在YouView视图中调用数据时抛出错误:Error: Thread 1: "executeFetchRequest:error: A fetch request must have an entity."
已尝试使用.shared变体,错误依旧。
相关代码
DataController.swift
import Foundation import CoreData class DataController: ObservableObject { let container = NSPersistentContainer(name: "DataModel") init() { container.loadPersistentStores { desc, error in if let error = error { print("Daten wurden nicht geladen: \(error.localizedDescription)") } } } func save(context: NSManagedObjectContext) { do { try context.save() print("Daten wurden gespiechert!") } catch { print("Daten konnten nicht gespeichert werden.") } } func addPlayer(name: String, isUser: Bool, context: NSManagedObjectContext) { let player = Player(context: context) player.id = UUID() player.name = name player.isUser = isUser save(context: context) } func editPlayerName(player: Player, name: String, context: NSManagedObjectContext) { player.name = name save(context: context) } }
DartToolsApp.swift
import SwiftUI @main struct DartToolsApp: App { @StateObject private var userDefaults = UserDefaults() @StateObject private var dataController = DataController() var body: some Scene { WindowGroup { ContentView() .environment(\.managedObjectContext, DataController().container.viewContext) .environmentObject(UserDefaults()) } } }
YouView.swift
import SwiftUI import CoreData struct YouView: View { @EnvironmentObject var userDefaults: UserDefaults @FetchRequest(sortDescriptors: []) var players: FetchedResults<Player> @Environment(\.managedObjectContext) var managedObjectContext var body: some View { NavigationStack { Form { } .navigationTitle("\(findUser()) (Du)") } } func findUser() -> String { if let index = players.firstIndex(where: { $0.isUser }) { let output = players[index].name! return output } else { return "" } } }
创建用户的代码
DataController().addPlayer(name: nameText, isUser: true, context: managedObjectContext)
解决方案
1. 统一CoreData上下文实例
在DartToolsApp中,你创建了@StateObject的dataController,但注入环境的是新生成的DataController()实例的上下文,导致@FetchRequest无法关联到正确的实体上下文。修改如下:
@main struct DartToolsApp: App { @StateObject private var userDefaults = UserDefaults() @StateObject private var dataController = DataController() var body: some Scene { WindowGroup { ContentView() // 使用已初始化的dataController实例的上下文 .environment(\.managedObjectContext, dataController.container.viewContext) // 使用已初始化的userDefaults实例 .environmentObject(userDefaults) // 将dataController注入环境,方便其他视图调用 .environmentObject(dataController) } } }
2. 调用DataController方法时使用统一实例
创建用户时,不要生成新的DataController实例,而是通过环境对象获取已有的实例:
在需要创建用户的视图中添加:
@EnvironmentObject var dataController: DataController
然后调用方法:
dataController.addPlayer(name: nameText, isUser: true, context: managedObjectContext)
3. 确保实体类和DataModel匹配
检查Player实体类是否正确生成,确保DataModel.xcdatamodeld中的实体名称和代码中的Player一致,并且实体类已经正确关联到CoreData容器。
完成以上修改后,@FetchRequest就能正确获取到实体的上下文,解决报错问题。
内容的提问来源于stack exchange,提问作者scotland1912
相关产品推荐
相关产品推荐

