CoreData对于data manager对象提供了数据验证的机制,只有验证成功才可以插入底层的持久存储,参考如下代码:
if let ks = NSManagedObject(entity: entity,insertInto: containerVC.managedObjectContext) as? KsMain{
//fill data to ks object
//插入数据库
insert(ks)
}
func insert(_ ks:KsMain){
do{
try ks.validateForInsert()
saveContext()
}catch{
print(error.localizedDescription)
}
}
我们当然在KsMain类中写了验证的方法,测试可知当ks未能通过验证时的确无法插入底层的数据库,但是和context绑定的TableView刷新时仍然出现了该ks对象!
这是我们不希望看到的!我们希望当底层的数据验证失败时context也不要插入任何数据.这可以通过两种方法来解决.
1.在创建ks对象时不绑定context,而在实际插入时再指定context:
if let ks = NSManagedObject(entity: entity,insertInto: nil) as? KsMain{
//same code
}
func insert(_ ks:KsMain){
do{
try ks.validateForInsert()
managedObjectContext.insert(ks)
saveContext()
}catch{
print(error.localizedDescription)
}
}
上面的insert方法中的第一句validateForInsert实际无法插入因为ks对象创建时绑定的context为nil,实际插入数据库靠的是第二句.
2.或者我们可以在创建ks时绑定有效的context,但是在验证失败时重置context,从而将任何不在底层数据库中的数据删除掉:
if let ks = NSManagedObject(entity: entity,insertInto: containerVC.managedObjectContext) as? KsMain{
//fill data to ks object
//插入数据库
insert(ks)
}
func insert(_ ks:KsMain){
do{
try ks.validateForInsert()
saveContext()
}catch{
context.reset()
print(error.localizedDescription)
}
}