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

前端之家收集整理的这篇文章主要介绍了CoreData数据验证失败仍然插入context的解决前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

猜你在找的Swift相关文章