You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:15:36