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

SwiftData修改收藏状态后重启丢失问题求助

SwiftData收藏状态重启后丢失的解决方案

问题1:模型初始化方法的拼写错误与参数忽略

你的Racquet类初始化方法存在拼写错误,且硬编码覆盖了传入的isFavorite参数,导致无论传入什么值,收藏状态都会被重置为false:

原错误代码:

init (id: String, name: String, isFavorite: Bool) {
    self.id = id
    self.name = name
    self.isfavorite = false // 拼写错误:属性名为isFavorite,且未使用传入参数
}

修复后:

init(id: String, name: String, isFavorite: Bool) {
    self.id = id
    self.name = name
    self.isFavorite = isFavorite // 修正拼写并使用传入的参数
}

问题2:每次启动重新插入JSON数据,覆盖原有修改

RacquetsContainer.create()方法每次启动都会从JSON导入数据并插入容器,即使容器中已有修改过的记录。由于id标记为@Attribute(.unique),新插入的记录会覆盖原有数据,导致收藏状态丢失。

修复方法:先检查容器是否已有数据,仅为空时才执行JSON导入:

actor RacquetsContainer {
    @MainActor
    static func create() -> ModelContainer {
        let schema = Schema([Racquet.self])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
        let container = try! ModelContainer(for: schema, configurations: [modelConfiguration])
        
        // 检查容器中是否已有数据
        let fetchDescriptor = FetchDescriptor<Racquet>()
        guard try! container.mainContext.fetch(fetchDescriptor).isEmpty else {
            return container
        }
        
        // 仅空容器时导入JSON数据
        let listRacquet = CategorieJSONDecoder.decode(from:"db")
        if !listRacquet.isEmpty {
            listRacquet.forEach { racquetDTO in
                let racquet = Racquet(id: racquetDTO.id, name: racquetDTO.name, isFavorite: racquetDTO.isfavorite)
                container.mainContext.insert(racquet)
            }
            try! container.mainContext.save() // 手动保存初始数据
        }
        return container
    }
}

可选优化:确保修改后状态及时持久化

虽然SwiftData默认自动保存上下文,但手动触发保存可避免意外丢失。同时简化按钮逻辑:

// DetailedView中收藏按钮简化写法
Button {
    racquet.isFavorite.toggle()
    try? modelContext.save()
} label: {
    Image(systemName: racquet.isFavorite ? "star.fill" : "star")
}

内容的提问来源于stack exchange,提问作者FDA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:13:12