我正在尝试在我的 iPhone 应用程序中使用由 Core Data 管理并与 iCloud 同步的数据库。
我使用了 WWDC 2012 中的示例代码,并设法使其几乎正常工作。
另外,我的数据库很简单:只有一种对象,没有关系。
两个设备可以通过 iCloud 进行通信,但是,这个小场景失败了:
- 在设备 A 上创建一个对象
- 等待对象出现在设备 B 上
- 修改设备A上的对象
- 修改设备 B 上的对象
- 当设备 B 知道更新时,它会尝试合并更改并且应用程序崩溃。
是的,应用程序崩溃了。我的数据库中只有一个对象,Core Data 似乎无法解决一点点冲突。
以下是我创建持久存储的方式以及使用哪些选项:
NSDictionary *options = @{NSPersistentStoreUbiquitousContentNameKey : contentName,
NSPersistentStoreUbiquitousContentURLKey : iCloudLogsPath};
self.iCloudStore = [self.persistentStoreCoordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:iCloudData
options:options
error:&error];
这是我用来在后台创建 NSManagedObjectContext 的代码:
- (NSManagedObjectContext*) currentThreadContext {
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[moc setPersistentStoreCoordinator:self.persistentStoreCoordinator];
[moc setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
return moc;
}
我确实添加了一个断点来捕获任何异常,这是我得到的:
objc_exception_throw:
[NSPersistentStoreCoordinator executeRequest:withContext:error:]:
[NSManagedObjectContext save:]:
[_PFUbiquityRecordImportOperation main]:
[__NSOperationInternal start]:
[_PFUbiquityRecordsImporter scheduleTransactionLogOperations:synchronous:error:]:
[_PFUbiquityRecordsImporter scanOperationFinished:withDiscoveredLogLocation:error:]:
[PFUbiquityImportScanOperation main]:
[__NSOperationInternal start]:
[_PFUbiquityRecordsImporter scheduleUbiquityRootScan:withLocalPeerLogs:error:]:
[_PFUbiquityRecordsImporter rollResponseOperation:successfullyAdoptedBaseline:]:
[PFUbiquityBaselineRollResponseOperation main]:
[__NSOperationInternal start]:
任何帮助将不胜感激!