核心数据存储多个存储的原子性

Mik*_*lah 9 macos cocoa core-data

核心数据允许您将多个持久性存储添加到单个NSPersistentStoreCoordinator(每个具有不同的配置)名称,从而将它们组合在一起NSManagedObjectContext.我无法找到的是Core Data如何处理多个商店的保存操作的原子性.

假设我有两家商店:

NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] init];
[coordinator addPersistentStoreWithType:type configuration:@"A" URL:aURL options:nil error:NULL];
[coordinator addPersistentStoreWithType:type configuration:@"B" URL:bURL options:nil error:NULL];

NSManagedObjectContext *context = [[NSManageObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
Run Code Online (Sandbox Code Playgroud)

然后是时候保存我这样做:

NSError *error = nil;
BOOL result = [context save:&error];
Run Code Online (Sandbox Code Playgroud)

文档说明事件的顺序是:

  1. 保存商店A.
  2. 保存商店B.

如果商店A保存正确,但商店B由于某种原因无法保存怎么办?(例如,磁盘上的文件被删除,或者权限被设置为只读,那种事情).我找不到任何详细说明Core Data是否会将更改回滚到商店A的文档.

对我来说似乎很奇怪,对象图将保持不一致状态(即一个商店更新,一个没有更新),但在多个商店中执行完全原子保存有点棘手和资源密集.我真的想在这里做一些澄清,也许来自对系统有更多经验的人!

Mik*_*lah 5

我今天终于偶然发现了答案CoreDataErrors.h.有一个错误代码:

    NSPersistentStoreIncompleteSaveError             = 134040, // one or more of the stores returned an error during save (stores/objects that failed will be in userInfo)
Run Code Online (Sandbox Code Playgroud)

因此,似乎Core Data不会尝试从成功的商店中回滚保存.并且确实不能跨多个商店提供原子性.很公平!