iOS核心数据迁移大问题

时间:2014-02-12 07:49:27

标签: ios objective-c core-data

当我开始开发应用时,我有核心数据模型 5个实体(名为Visitors, UnreadMessages, ContactStatuses, UserVCardUser)。该应用程序在app store上运行..没有问题..现在我不得不添加一些需求更改,因此核心数据模型通过添加 2个更多实体而略有改变(名为{{1 }和AudioSupportedWindows

所以根据很多文章,SO帖子和苹果文档,迁移它的方法是 LightWeight迁移所以为此我添加了以下代码

AudioMessages

在我的NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; NSError *error; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { // Handle error NSLog(@"Problem with PersistentStoreCoordinator: %@",error); } 方法中。但它总是会出现 persistentStoreCoordinator 错误。

之后,我开始根据此链接Core Data - Default Migration ( Manual )

使用迁移映射进行手动迁移

但是当我运行这个时,我得到源模型和目标模型,但它们是相同的,它们都包含5个实体。我收到此错误 Can't find model for source store

非常麻烦,现在解决这个问题......任何帮助都会非常感激。

编辑1

The model used to open the store is incompatible with the one used to create the store

4 个答案:

答案 0 :(得分:1)

确保原始模型和新模型都包含在您的应用中的模型包中。你不能只包括新模型并期望它迁移(尽管那会更酷),它不是它的工作方式。

您的新模型应该被标记为“当前模型”。您的旧模型仍然可以读取旧文件。如果新模型中没有必需的新字段不在旧模型中,则轻量级翻译应该有效。

答案 1 :(得分:1)

您认为自己发布的模型与实际模型不同。 检查您提交给iTC的内容:

  • 转到管理器/档案馆找到您提交的档案,然后“在Finder中显示”
  • 找到模型版本文件: VersionInfo.plist
  • 打开plist,查看每个实体的哈希值

将哈希值与当前模型的哈希值进行比较(只需创建一个新的存档),您应该能够找到已更改的哈希值。

答案 2 :(得分:1)

这可能是我跑了几次的问题。从应用商店下载您的应用并运行它,以便创建托管对象库。然后在您的xcode 之前实例化持久性商店协调员,请尝试以下操作:

// Model.momd/Model is the path of the previous model. Make sure it's correct
NSURL *oldUrl = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"Model.momd/Model"] withExtension:@"mom"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:oldUrl];
NSLog(@"Old model version hashes: %@", model.entityVersionHashesByName);

// Change model with your model name
NSURL *currentModelUrl = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"Model"] withExtension:@"momd"];
NSManagedObjectModel *currentModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:currentModelUrl];
NSLog(@"Current model version hashes: %@", currentModel.entityVersionHashesByName);



// storeUrl is the path to the persistent store, created by the app store version
NSDictionary *metadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeUrl error:nil];
NSLog(@"Store metadata: %@", metadata);

元数据实体哈希值应与旧版本哈希值相同。如果不是,那么您拥有的原始型号和您随附的型号是不同的。您可能需要在源代码管理仓库中找到旧模型(希望您有一个),否则您可以尝试手动更改这些值。

答案 3 :(得分:0)

谢谢大家的帮助......我使用轻量级迁移解决了它...我做的是删除我的xcdatamodeld,从App Store上的那个重新创建它,制作新的数据库文件,添加新的模型版本。不知怎的,我没有想知道它是如何运作的......

但他们很高兴它有效:)