第 4 章:数据操作与管理
创建对象-使用 ModelContext.insert()
基本用法
在 SwiftData 中创建新对象的核心方法是 ModelContext.insert()。该方法接受一个符合 @Model 协议的实例,并将其添加到持久化上下文中:
let newTask = Task(title: "完成SwiftData学习", isCompleted: false)
modelContext.insert(newTask)
关键注意事项
瞬时对象与持久化对象:
- 调用
insert()前:对象仅存在于内存中(瞬时状态) - 调用
insert()后:对象被标记为待持久化(需调用save()才会写入存储)
- 调用
批量插入优化: 对于大量数据创建,建议使用批量操作:
let tasks = sampleTasks.map { Task(title: $0) } tasks.forEach { modelContext.insert($0) }
关联对象处理
当插入包含关系的对象时,SwiftData 会自动处理关系绑定:
let project = Project(name: "SwiftData教程")
let task = Task(title: "编写示例代码", project: project)
// 只需插入task,关联的project会自动处理
modelContext.insert(task)
错误处理
建议将插入操作包裹在 do-catch 块中:
do {
let newItem = InventoryItem(name: "MacBook Pro", stock: 10)
modelContext.insert(newItem)
try modelContext.save()
} catch {
print("插入失败: \(error.localizedDescription)")
}
调试技巧
- 检查对象状态:
print(modelContext.isRegistered(newObject)) // 返回true表示已注册 - 使用
NSManagedObject兼容方法(调试时):print((newTask as? NSManagedObject)?.objectID)
最佳实践
- 业务逻辑分离:建议在专门的
DataManager类中封装插入逻辑 - 上下文生命周期:注意对象与
ModelContext的生命周期绑定 - 批量操作:大量插入时考虑使用
@BatchInsert宏(Swift 5.9+)
注意:在 SwiftUI 环境中,通常通过
@Environment(\.modelContext)获取上下文,而在其他场景可通过ModelContainer的mainContext获取主线程上下文。
