Core Data 批量更新(iOS 8 特性)

不做查询,直接在Store层进行更新,iOS 8 的特性。

举例一种情况,如果我们要对十万条数据都进行同样的一个属性的更新,一般的做法我们需要取出这十万条数据,我们取出十多万条数据只是为了做一个很简单的更新。

经典的案例是电子邮箱类似的APP中 标记所有邮件为已读 这样的需求,难道要把上千封邮件全部请求出来吗,显然不是。

iOS 8 发布了支持 批量更新(Bench Update)NSBatchUpdateRequest,使用它可以在不做查询的情况下更新数据。

NSBatchUpdateRequest 实现的原理是完全绕开了 NSManagedObjectContext,直接去 NSPersistentStore 层去做 Update。

    //这四行代码,在初始化的时候配置好EntityName, 配置影响的property和更改的值 以及 配置影响的Store,以及返回Result的数据类型。
    //创建NSBatchUpdateRequest 的实例,entityName 作为初始化参数。
    let batchUpdate = NSBatchUpdateRequest(entityName: "myEntityName")
    //标明需要 Update 的 property 和 值
    batchUpdate.propertiesToUpdate = ["favorite" : NSNumber(bool: true)]
    //被影响的Stores 默认情况下这么写就可以,如果涉及比较多的PersistentStores 情况就更复杂了。
    batchUpdate.affectedStores = coreDataStack.context.persistentStoreCoordinator!.persistentStores
    //配置返回数据的类型,还可以是 UpdatedObjectIDsResultType。
    batchUpdate.resultType = .UpdatedObjectsCountResultType

    //执行批量更新
    do {
      let batchResult = try coreDataStack.context.executeRequest(batchUpdate) as! NSBatchUpdateResult
      print("Records updated \(batchResult.result!)")
    } catch let error as NSError {
        print("Could not update \(error), \(error.userInfo)")
    }

在初始化的时候配置好EntityName, 配置影响的property和更改的值 以及 配置影响的Store,以及返回Result的数据类型。

另外提一下:如同这种在 Store 层的数据更新,数据删除也有同样的API,在 iOS 9 的时候苹果提供了一个类似 NSBatchUpdateRequest 的类来做在 Store 层的数据删除,使用 —- NSBatchDeleteRequest,同样它们两个都是 NSPersistentStoreRequest 的子类。

注意:

额外需要注意的一点是,前面提到了「NSBatchUpdateRequest 实现的原理是完全绕开了 NSManagedObjectContext,直接去 NSPersistentStore 层去做 Update。」
所以做了批量 Update / Delete 之后,你之前请求的那部分数据已经失效了,因为它们跟数据库已经失去了同步性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值