我已经阅读了一些博客,但我仍然对如何使用NSPersistentContainer performBackgroundTask创建实体并保存它感到困惑.通过调用方便的方法创建一个实例后init(context moc: NSManagedObjectContext)的performBackgroundTask() { (moc) in }块,如果我检查container.viewContext.hasChanges这个返回false,并说没有什么保存的,如果我叫节省moc(该块所产生的背景MOC)我得到的错误是这样的:
Run Code Online (Sandbox Code Playgroud)fatal error: Failure to save context: Error Domain=NSCocoaErrorDomain Code=133020 "Could not merge changes." UserInfo={conflictList=( "NSMergeConflict (0x17466c500) for NSManagedObject (0x1702cd3c0) with objectID '0xd000000000100000 <x-coredata://3EE6E11B-1901-47B5-9931-3C95D6513974/Currency/p4>' with oldVersion = 1 and newVersion = 2 and old cached row = {id = 2; ... }fatal error: Failure to save context: Error Domain=NSCocoaErrorDomain Code=133020 "Could not merge changes." UserInfo={conflictList=( "NSMergeConflict (0x170664b80) for NSManagedObject (0x1742cb980) with objectID '0xd000000000100000 <x-coredata://3EE6E11B-1901-47B5-9931-3C95D6513974/Currency/p4>' …
基于Core Data的iOS应用程序的一些客户报告他们偶尔会丢失数据.这些报道非常奇怪,这就是我要求你对此采取行动的原因.客户报告说,当他们在一段时间(几分钟,几小时或第二天)之后重新打开应用程序时,他们的一些数据会丢失,就像底层数据库恢复到以前的状态一样.
我已经使用Core Data多年了,之前从未遇到类似这样的问题.应用程序非常简单,这意味着我只使用一个托管对象上下文,并在应用程序进入后台之前提交更改.
我意识到这是一个长镜头,但是这可能是导致此类问题的一些潜在原因,或者我可以通过哪些检查来收集更多信息?不幸的是,我无法自己重现这个问题,这将使这一切变得更加容易.
更新:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator) return _persistentStoreCoordinator;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Prime.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{ NSMigratePersistentStoresAutomaticallyOption : @YES, NSInferMappingModelAutomaticallyOption : @YES } error:&error]) {
// Error Handling
}
return _persistentStoreCoordinator;
}
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用Core Data,并发现了模拟器的一些奇怪的行为:当我在我的应用程序中向Core Data添加一些数据并使用XCode中的"stop"按钮退出模拟器时(或者只是按下Cmd-Q),下次启动模拟器时,数据不会存储在数据库中.经过一些测试,我发现数据存储到磁盘:
调用[NSManagedObjectContext save:]无效.行为是一样的.
所以我的问题是:这种行为的原因是什么?在退出之前有没有办法强制刷新到磁盘?当在设备上运行时,我是否有以这种方式丢失数据的风险(个人而言,我没有看到任何,除了强制关闭,但奇怪的行为困扰我一点)