SwiftData一对一关联插入数据时避免重复的问题求助
SwiftData关联插入时避免重复数据崩溃的解决方案
问题根源
你直接创建新的ShowsRowLocal实例并关联WatchlistRowLocal插入时,SwiftData不会自动识别数据库中已有相同id的ShowsRowLocal,会尝试插入重复记录触发唯一约束崩溃。直接调用modelContext.insert(show)能实现upsert,但没法同时完成和WatchlistRowLocal的关联。
解决代码
修改插入逻辑,先查询复用已有实例,再处理关联:
// 1. 查询数据库中是否存在对应id的ShowsRowLocal let predicate = #Predicate<ShowsRowLocal> { $0.id == viewModel.show.databaseId } let existingShow = try? modelContext.fetch(FetchDescriptor(predicate: predicate)).first // 2. 复用已有实例或创建新实例 let showRow = existingShow ?? ShowsRowLocal(id: viewModel.show.databaseId) // 3. 检查是否已存在关联的WatchlistRowLocal,避免重复插入 if showRow.watchlistRow == nil { let watchlistRow = WatchlistRowLocal(show: showRow) modelContext.insert(watchlistRow) } // 手动保存上下文(按需执行,部分场景自动保存) try? modelContext.save()
关键说明
- 通过查询复用已有
ShowsRowLocal实例,从根源避免重复插入触发唯一约束错误。 - 增加
showRow.watchlistRow == nil的判断,确保同一个ShowsRowLocal不会被重复关联WatchlistRowLocal,符合你的模型关联设计。
内容的提问来源于stack exchange,提问作者Curt Orion-Indev
相关产品推荐
相关产品推荐

