我的情况是similar to this question.我正在使用带有以下代码的轻量级迁移,相当来自Apple文档和其他SO线程。它在应用程序启动时在初始化Core Data堆栈时运行。
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
NSString *storeType = nil;
if (USE_SQLITE) { // app configuration
storeType = NSSQLiteStoreType;
} else {
storeType = NSBinaryStoreType;
}
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
// the following line sometimes crashes on app startup
if (![persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nil URL:[self persistentStoreURL] options:options error:&error]) {
// handle the error
}
对于某些用户,尤其是设备速度较慢的用户,我在指定行的日志中确认了崩溃。
据我所知,修复方法是将其切换为手动映射和迁移。这样做的秘诀是什么?对我来说,漫长的道路是通过所有Apple文档,但我不记得有专门针对模式迁移的优秀示例和教程。
答案 0 :(得分:3)
有很多关于如何进行手动迁移的例子,但基本步骤是:
然而,崩溃是什么?您是否被操作系统杀死了太长时间?由于手动迁移无法解决这个问题。
您使用什么类型的后备存储?如果您使用二进制文件,则可能会耗尽内存,因为迁移将在内存中有两个整个数据库副本。
从OP评论中我想我已经看到过这种情况也会发生在SQLite上,所以也许除了内存之外还有其他东西,尽管这是一个有效的观点。是的,操作系统因为耗时太长而被杀,特别是在1G设备上。我认为手动迁移也是一种从“具有超时限制的应用启动时迁移”转变为没有时间限制的方式,并且可能在后台线程等上进行迁移。 ?
由于您要更改数据源,因此无法在后台线程上进行迁移。如果您的迁移在启动时耗时太长,那么推荐的解决方案是:
-applicationDidFinishLaunching:
循环完成运行循环,而不会触及核心数据。这将阻止崩溃如果您使用的是二进制存储,则可能仍会遇到内存问题,但这可以解决启动时的崩溃问题。崩溃是操作系统说“我认为你已经锁定”。通过让-applicationDidFinishLaunching:
完成,您告诉操作系统您还没有锁定。