加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:29:54 所属栏目:百科 来源:网络整理
导读:CoreData对于data manager对象提供了数据验证的机制,只有验证成功才可以插入底层的持久存储,参考如下代码: if let ks = NSManagedObject(entity: entity,insertInto: containerVC.managedObjectContext) as ? KsMain{ //fill data to ks object //插入数据库

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)
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读