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
相关产品推荐
相关产品推荐

