首页 > 解决方案 > 轻量级和重量级迁移期间核心数据崩溃

问题描述

我正在尝试在 Core Data 中进行轻量级迁移。我只是想在现有实体中添加一个新属性。为此目的创建了新的模型版本。每次应用程序运行时,它会在启动后立即在运行时崩溃并显示以下消息:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't use fetch request with fetched property description (entity model mismatch).'

另外,我启用了 SQL 调试标志,在崩溃之前我得到了这个:

CoreData: annotation: Disconnecting from sqlite database.

笔记:

  1. 这是第 33 次迁移(我已经完成了 32 次,没有任何问题,也没有添加单个属性......)
  2. 我通过协调器加载持久存储来使用最新的 API,但如果我通过添加持久存储以旧方式执行此操作,也会发生同样的情况。
  3. 每次对模型进行可能的更改(添加属性、重命名属性、添加/删除实体)后都会发生崩溃
  4. 我使用 XCode 12.2 和 Swift 5.3。同样的崩溃也发生在 XCode 12.1 中
  5. 如果我也尝试使用自定义映射模型进行重量级迁移,崩溃仍然存在。
  6. 我使用 FirebaseCrashlytics 并设法为此崩溃报告:
Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x1aca24878 __exceptionPreprocess
1  libobjc.A.dylib                0x1c0f7ac50 objc_exception_throw
2  CoreFoundation                 0x1ac91d4a4 -[NSCache init] <- CRASH HERE
3  CoreData                       0x1b2c4a984 -[NSFetchedPropertyDescription setFetchRequest:]
4  CoreData                       0x1b2c4aab4 -[NSFetchedPropertyDescription _createCachesAndOptimizeState]
5  CoreData                       0x1b2c3d608 -[NSEntityDescription(_NSInternalMethods) _createCachesAndOptimizeState]
6  CoreData                       0x1b2c8305c -[NSManagedObjectModel(_NSInternalMethods) _createCachesAndOptimizeState]
7  CoreData                       0x1b2c83f94 -[NSManagedObjectModel(_NSInternalMethods) _setIsEditable:optimizationStyle:]
8  CoreData                       0x1b2b30e40 -[NSStoreMigrationPolicy(InternalMethods) _gatherDataAndPerformMigration:]
9  CoreData                       0x1b2c9e494 __91-[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:]_block_invoke
10 CoreData                       0x1b2cab6f4 gutsOfBlockToNSPersistentStoreCoordinatorPerform
11 libdispatch.dylib              0x1ac618db0 _dispatch_client_callout
12 libdispatch.dylib              0x1ac627428 _dispatch_lane_barrier_sync_invoke_and_complete
13 CoreData                       0x1b2c9b268 _perform
14 CoreData                       0x1b2b30744 -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:]
15 CoreData                       0x1b2c9d3f8 -[NSPersistentStoreCoordinator _doAddPersistentStoreWithDescription:privateCopy:completeOnMainThread:withHandler:]
16 libdispatch.dylib              0x1ac61724c _dispatch_call_block_and_release
17 libdispatch.dylib              0x1ac618db0 _dispatch_client_callout
18 libdispatch.dylib              0x1ac61bddc _dispatch_queue_override_invoke
19 libdispatch.dylib              0x1ac62993c _dispatch_root_queue_drain
20 libdispatch.dylib              0x1ac62a120 _dispatch_worker_thread2
21 libsystem_pthread.dylib        0x1f5e3c7c8 _pthread_wqthread
22 libsystem_pthread.dylib        0x1f5e4375c start_wqthread

非常感谢任何帮助,因为我无法在这种状态下更新我的应用程序。

标签: iosswiftcore-datacore-data-migration

解决方案


我的数据模型中似乎有一个“坏”的模型版本。正如我在最初的帖子中解释的那样,我有 33 个模型版本。在我在 Apple Code Level Support 中提出了一个技术问题后,一位工程师指导我将过去的版本一个一个删除,因为他发现其中一个是导致崩溃的原因,而只保留了最后两个。最终,他是正确的,因为我发现模型版本 15 是罪魁祸首。这个问题很可能是核心数据的内部错误,我也打开了一个反馈票。让我们希望这将在 XCode 的未来版本中得到解决。现在,我删除了所有过去的版本——包括罪魁祸首——因为我不再需要它们并且崩溃已经消失。


推荐阅读