入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

CoreData数据验证失败仍然插入context的解决(一)

创建时间:2017-01-01 投稿人: 浏览次数:629

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)
        }
    }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像