迁移后更改核心数据时崩溃

Posted

技术标签:

【中文标题】迁移后更改核心数据时崩溃【英文标题】:Crash on change to Core Data after migration 【发布时间】:2015-03-19 02:25:26 【问题描述】:

所以我遇到了一个奇怪的崩溃我希望有人可以读取崩溃数据。大约一个月前,我为一个应用程序构建了一个核心数据模型。它有 12 个实体,每个实体与其他实体有多种关系。大约两周前(试飞后),我想更新模型。我对模型进行了版本化,将两个标志(NSMigratePersistentStoresAutomaticallyOption、NSInferMappingModelAutomaticallyOption)添加到persistentStoreCoordinator的创建中并进行了更改。我启动了应用程序,模型被迁移,我正在路上。从那时起,我对数据模型的版本 2 进行了其他更改,没有任何困难。今天,我向一个实体添加了一个布尔属性,现在应用程序在启动时崩溃了。如果我删除新添加的属性,该应用程序工作正常。我很难理解在过去的两周里,我是如何顺利地向版本 2 添加属性、实体甚至关系的。这个布尔标志是众所周知的稻草吗?非常感谢任何指导。这是崩溃日志:

2015-03-18 22:01:16.778 GroupShop[67338:2060644] CoreData: 错误:-addPersistentStoreWithType:SQLite 配置:(null) URL:file:///Users/tom/Library/Developer/CoreSimulator/Devices/0FD3C702- 3CB8-49AA-AA22-72FED2328608/data/Containers/Data/Application/37785998-3FC9-4C96-ADD4-920BAAB1CCFD/Documents/store.data 选项: NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1; ...返回错误错误域=NSCocoaErrorDomain代码=134130“操作无法完成。(可可错误134130。)”用户信息=0x7fb9733d86e0 URL=file:///Users/tom/Library/Developer/CoreSimulator/设备/0FD3C702-3CB8-49AA-AA22-72FED2328608/data/Containers/Data/Application/37785998-3FC9-4C96-ADD4-920BAAB1CCFD/Documents/store.data, metadata= NSPersistenceFrameworkVersion = 519; NSStoreModelVersionHashes = GSFullImage = ; GSGroupShop = ; GSInvites = ; GSItem = ; GSItemCategory = ; GSLocation = ; GSMembers = ; GSMessageText = ; GSNotificationDetail = ; GSOpinion = ; GSPermissions = ; GSShoppingItems = ; ; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( “” ); NSStoreType = SQLite; NSStoreUUID = "B8C295E3-8527-4438-BB39-6CBAFAF97194"; "_NSAutoVacuumLevel" = 2; , reason=Can't find model for source store 使用 userInfo 字典 URL = "file:///Users/tom/Library/Developer/CoreSimulator/Devices/0FD3C702-3CB8-49AA-AA22-72FED2328608/data/Containers/Data/Application/37785998-3FC9-4C96-ADD4-920BAAB1CCFD/Documents/存储数据”; 元数据 = NSPersistenceFrameworkVersion = 519; NSStoreModelVersionHashes = GSFullImage = ; GSGroupShop = ; GSInvites = ; GSItem = ; GSItemCategory = ; GSLocation = ; GSMembers = ; GSMessageText = ; GSNotificationDetail = ; GSOpinion = ; GSPermissions = ; GSShoppingItems = ; ; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( “” ); NSStoreType = SQLite; NSStoreUUID = "B8C295E3-8527-4438-BB39-6CBAFAF97194"; "_NSAutoVacuumLevel" = 2; ; reason = "找不到源存储的模型"; 2015-03-18 22:01:16.781 GroupShop[67338:2060644] CoreData: annotation: NSPersistentStoreCoordinator 的当前模型哈希是 GSFullImage = ; GSGroupShop = ; GSInvites = ; GSItem = ; GSItemCategory = ; GSLocation = ; GSMembers = ; GSMessageText = ; GSNotificationDetail = ; GSOpinion = ; GSPermissions = ; GSShoppingItems = ; 2015-03-18 22:01:16.831 GroupShop[67338:2060644] *** 由于未捕获的异常“打开失败”而终止应用程序,原因:“原因:操作无法完成。 (可可错误 134130。)' *** 首先抛出调用堆栈: ( 0 核心基础 0x000000010ce84a75 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010bfe2bb7 objc_exception_throw + 45 2 核心基础 0x000000010ce849ad +[NSException raise:format:] + 205 3 GroupShop 0x000000010b416813 -[GSDataAccess initPrivate] + 867 4 GroupShop 0x000000010b416472 __32+[GSDataAccess sharedDataAccess]_block_invoke + 50 5 libdispatch.dylib 0x00000001107fb614 _dispatch_client_callout + 8 6 libdispatch.dylib 0x00000001107e7881 dispatch_once_f + 565 7 GroupShop 0x000000010b41641d +[GSDataAccess sharedDataAccess] + 141 8 GroupShop 0x000000010b3a7066 -[GSUtility initSimple] + 182 9 GroupShop 0x000000010b3a6f72 __26+[GSUtility sharedUtility]_block_invoke + 50 10 libdispatch.dylib 0x00000001107fb614 _dispatch_client_callout + 8 11 libdispatch.dylib 0x00000001107e7881 dispatch_once_f + 565 12 GroupShop 0x000000010b3a6f1d +[GSUtility sharedUtility] + 141 13 GroupShop 0x000000010b3b20e5 -[AppDelegate 应用程序:didFinishLaunchingWithOptions:] + 581 14 UIKit 0x000000010ddf3458-[UIApplication_handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 248 15 UIKit 0x000000010ddf4002-[UIApplication_callInitializationDelegatesForMainScene:transitionContext:] + 2540 16 UIKit 0x000000010ddf6e3e-[UIApplication_runWithMainScene:transitionContext:completion:] + 1349 17 UIKit 0x000000010ddf5d35-[UIApplication 工作区DidEndTransaction:] + 179 18 FrontBoardServices 0x0000000112728243 __31-[FBSSerialQueue performAsync:]_block_invoke + 16 19 核心基础 0x000000010cdb9c7c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 20 核心基础 0x000000010cdaf9c5 __CFRunLoopDoBlocks + 341 21 核心基础 0x000000010cdaf183 __CFRunLoopRun + 851 22 核心基础 0x000000010cdaebc6 CFRunLoopRunSpecific + 470 23 UIKit 0x000000010ddf57a2-[UIApplication_run] + 413 24 UIKit 0x000000010ddf8580 UIApplicationMain + 1282 25 GroupShop 0x000000010b408033 主要 +

【问题讨论】:

【参考方案1】:

您不能一直更改相同的模型版本并期望 Core Data 跟上。您使用的迁移选项仅适用于数据与当前模型版本不匹配但确实与您的应用中包含的某些旧版本匹配的情况。通过自动轻量级迁移,Core Data 找出如何更新您的持久存储以使用新模型。如果您更改模型的 相同 版本,您可能会阻止 Core Data 将持久存储文件与 任何 模型版本匹配,然后您会收到此异常。

您提到您进行了一些更改并且效果很好。并非每个更改都会影响模型的版本哈希。核心数据模型由其实体的版本哈希唯一标识,由[NSEntityDescription versionHash] 返回。这又取决于NSRelationshipDescriptionNSAttributeDescriptionNSPropertyDescriptionversionHash 的值的结果。一些小的更改不会影响任何版本哈希。一般来说,更改不会影响版本哈希,除非它们影响底层 SQLite 文件中数据的格式。

添加新属性将更改 versionHashNSEntityDescription,这就是您遇到此问题的原因。如果您仍在从原始模型迁移数据,它仍然可以工作。这只是一个问题,因为您的数据使用的模型版本与您的应用程序中的任何内容都不匹配。

要修复,请执行以下操作之一:

使用此更改创建新的第三个模型版本并迁移到该版本,或者 删除现有数据并再次迁移版本 1--> 2,或者 撤消此最新更改,以便您的数据继续与您的最新模型版本匹配。

【讨论】:

非常感谢您的详细解释。 Core Data 对我来说仍然是黑匣子。我创建了第三个模型并在那里进行了更改,它似乎正在工作。一旦我发布了产品,它就有办法“折叠”模型,或者随着产品的增长,我会拥有一长串模型? 应用程序的交付版本需要包含当前模型版本以及用户可能要升级的每个版本。如果模型经常更改,它可能会变得很多。您不需要包含仅在开发期间使用的模型版本,而这些模型版本从未在以前的应用程序版本中发布。如果用户可能拥有使用特定模型版本的旧数据,则该模型版本需要在应用中可用。

以上是关于迁移后更改核心数据时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

由于核心数据迁移,应用程序在从应用商店更新后崩溃

轻量级核心数据迁移后崩溃

核心数据版本控制(轻量级迁移)问题

核心数据迁移:更改持久存储类型

数据库迁移后保存核心数据时 Cocoa 报错 134030

尝试迁移数据库时,Django 应用程序在 Heroku 上崩溃