我如何修复:

线程1:"NSFetchRequest找不到实体名称‘提醒’的NSEntityDescription

我在另一篇文章中读到,如果我改变配置顺序,它就会起作用.但通过这样做,我只是更改了导致应用程序崩溃的模型.

import SwiftUI
import SwiftData
import CoreData
#if os(iOS) || os(macOS) || os(watchOS)
import WidgetKit
#endif

@main
struct Main: App {
    @Environment(\.scenePhase) private var scenePhase
    
    @StateObject var statsViewModel = StatsViewModel()
    @StateObject var badgeViewModel = BadgeViewModel()
    @StateObject var localNotificationManager = LocalNotificationManager()
    
    @AppStorage("notifications") var notificationsSet: Bool = false
    
    @Environment(\.modelContext) private var modelContext
        
    let container: ModelContainer
    
    init(){
        let fileContainer = URL.storeURL(for: "group.Water-Alert-App", databaseName: "CoreData")
        
        let defaultDirectoryURL = NSPersistentContainer.defaultDirectoryURL()
        
        let localSchema = Schema([Reminder.self])
        let cloudSchema = Schema([Goal.self, WaterData.self, Container.self])
        
        let localConfiguration = ModelConfiguration("Local", schema: localSchema, url: defaultDirectoryURL.appendingPathComponent("Local.sqlite"))
        
        let cloudConfiguration = ModelConfiguration("Cloud", schema: cloudSchema, url: fileContainer, cloudKitDatabase: .private("iCloud.Water-Alert-App-Offical"))
        
        container = try! ModelContainer(for:  Reminder.self, Goal.self, WaterData.self, Container.self, configurations: cloudConfiguration, localConfiguration)
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(statsViewModel)
                .environmentObject(badgeViewModel)
                .environmentObject(localNotificationManager)
                .task {
                    if !notificationsSet {
                        do{
                            try await localNotificationManager.reqeustAuthorization()
                            await localNotificationManager.setUpNotificationsAtStart()
                        } catch{
                            
                        }
                    }
                    notificationsSet = true
                }
            
        }
        .modelContainer(container)
        .onChange(of: scenePhase) { _, phase in
            if phase == .active{
                Task{
#if os(iOS) || os(macOS) || os(watchOS)
                    WidgetCenter.shared.reloadAllTimelines()
#endif
                    
                    await localNotificationManager.getCurrentSettings()
                    await localNotificationManager.getPendingRequest()
                }
            } else if phase == .background{
                do {
#if os(iOS) || os(macOS) || os(watchOS)
                    WidgetCenter.shared.reloadAllTimelines()
#endif
                    
                    try modelContext.save()
                } catch  {
                    print(error)
                }
            }
        }

这是导致应用程序崩溃的代码,只有当我通过视图中的查询访问提醒模型时,应用程序才会崩溃.

推荐答案

来自Apple DTS的 comments :

这是框架方面的一个问题--当应用程序使用带有多个ModelConfiguration的ModelContainer来管理多个store 时,只加载第一个配置中指定的模型类型,这会触发错误.

这个问题应该已经在iOS 17.4中修复了,现在是测试版2.你可以下载测试版,然后试一试.如果问题仍然存在,请随时跟进.

如果您希望支持17.4之前的版本,请考虑 for each 配置创建一个容器.

Swift相关问答推荐

为什么不能使用actor作为AsyncSequence中的状态机类型?

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

使用序列初始化字符串的时间复杂度是多少?

更改 SwiftUI 中按钮矩阵的填充 colored颜色

计算 CoreData 中所有唯一对象的数量?

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

如何让默认函数参数引用另一个函数参数?

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

为 ObservedObject 和 State 对象配置预览

MainActor 隔离可变存储属性为何会出现可发送错误?

如何为 Swift UI 视图定义 struct ?

使用列表的下一项更新相同的视图

令人满意的 var body:协议扩展中的一些视图

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

Xcode 13.3 将函数调用更改为属性访问

Swift 中 NSFetchRequest 的多个 NSPredicates?

为什么'nil' 与 Swift 3 中的 'UnsafePointer' 不兼容?

Alamofire:如何全局处理错误

如何快速显示数组的所有元素?

Xcode6 中的 Swift 类与 Cocoa Touch 类