如何从Core Data自动轻量级迁移切换到手动?

时间:2010-04-16 16:02:55

标签: iphone core-data migration mapping-model core-data-migration

我的情况是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文档,但我不记得有专门针对模式迁移的优秀示例和教程。

1 个答案:

答案 0 :(得分:3)

有很多关于如何进行手动迁移的例子,但基本步骤是:

  • 创建映射模型
  • 在您的项目中包含该映射模型
  • 关闭自动迁移

然而,崩溃是什么?您是否被操作系统杀死了太长时间?由于手动迁移无法解决这个问题。

您使用什么类型的后备存储?如果您使用二进制文件,则可能会耗尽内存,因为迁移将在内存中有两个整个数据库副本。

从OP评论中

更新

  

我想我已经看到过这种情况也会发生在SQLite上,所以也许除了内存之外还有其他东西,尽管这是一个有效的观点。是的,操作系统因为耗时太长而被杀,特别是在1G设备上。我认为手动迁移也是一种从“具有超时限制的应用启动时迁移”转变为没有时间限制的方式,并且可能在后台线程等上进行迁移。 ?

由于您要更改数据源,因此无法在后台线程上进行迁移。如果您的迁移在启动时耗时太长,那么推荐的解决方案是:

  • -applicationDidFinishLaunching:循环完成运行循环,而不会触及核心数据。这将阻止崩溃
  • 在下一次迭代中通过运行循环启动迁移(可能希望向用户提供某种进度指示器)并完成迁移。

如果您使用的是二进制存储,则可能仍会遇到内存问题,但这可以解决启动时的崩溃问题。崩溃是操作系统说“我认为你已经锁定”。通过让-applicationDidFinishLaunching:完成,您告诉操作系统您还没有锁定。