错误:线程 1:“executeFetchRequest:错误:获取请求必须具有实体。”

问题描述 投票:0回答:2

我正在尝试在我的 Xcode 项目 (SwiftUI) 中使用 CoreData。我创建了一个 Player 实体并想在名为“YouView”的视图中使用它。但是当我试图获取数据时,我从 Title 中得到了错误。我的应用程序称为 Dart 工具。我的应用程序语言是德语,所以如果您不了解 ui 的所有内容,请不要担心 :)。

感谢您的帮助!

我已经尝试过 .shared 变体 - 同样的错误

This is my .xcdatamodeld file (called DataModel.xcdatamodeld)

这是我的 DataController 文件的代码:

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

//The error is here:
@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())
        }
    }
}

这是我要使用数据的文件:

顺便说一句,这个视图是 TabView 的一部分。

import SwiftUI
import CoreData

struct YouView: View {
    
    @EnvironmentObject var userDefaults: UserDefaults
// I guess the error is because of this line:
    @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)

哇,那是很多代码。我希望你能帮助我!

swiftui core-data
2个回答
0
投票

您正在到处创建 DataController 的新实例,这本身就是一个问题,但是当您分配 \.managedObjectContext 环境变量时,认为导致您的特定错误的原因是。

因此,与其创建新实例,不如使用您的 @StateObject 实例。

所以在 App 代码中改变这个

var body: some Scene {
    WindowGroup {
        ContentView()
            .environment(\.managedObjectContext, dataController.container.viewContext)
    }
}

0
投票

首先删除

@StateObject private var userDefaults = UserDefaults()
@StateObject private var dataController = DataController()

因为两者都将被注入环境中。

而不是视图上下文,将数据控制器注入环境

.environmentObject(DataController())

其次使用always环境变量。每次调用 DataController() 都会创建一个新的、不同的实例。

在创建新用户的视图中添加

@EnvironmentObject var dataController: DataController

并在这个实例上调用 addPlayer。由于上下文是数据控制器的一部分,因此参数是多余的

dataController.addPlayer(name: nameText, isUser: true)

DataController添加一个属性managedObjectContext

lazy var managedObjectContext : NSManagedObjectContext = { return self. container.viewContext }()

并将方法 addPlayer 更改为

func addPlayer(name: String, isUser: Bool) {
    let player = Player(context: managedObjectContext)
    player.id = UUID()
    player.name = name
    player.isUser = isUser
    
    save(context: managedObjectContext)
}
© www.soinside.com 2019 - 2024. All rights reserved.