gpt4 book ai didi

iphone - 核心数据迁移 : methods in NSEntityMigrationPolicy not called.

转载 作者:可可西里 更新时间:2023-11-01 03:32:28 24 4
gpt4 key购买 nike

我有两个模型版本 - 12 和 13。然后我创建了一个包含源 12 和目标 13 的 xcmappingmodel-File。

我将 NSEntityMigrationPolicy 子类化并将我的类添加到映射模型文件到所需的实体。

@interface EndDateMigrationPolicy : NSEntityMigrationPolicy

enter image description here

在我的设备上安装旧版本 (11) 后,我安装了模型版本 13 的当前状态 - 应用程序运行,但未调用我的迁移方法。我错过了什么吗?

编辑:使用这些选项是否正确?

    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @YES,
NSInferMappingModelAutomaticallyOption: @YES};

最佳答案

我会尽我所能回答你,我经历过多次核心数据迁移,所以我知道这有多痛苦。对于一个人来说,您不能希望必须让您的迁移与这些选项一起工作,因为您尝试做的实际上不是轻量级迁移,但您却告诉它进行轻量级迁移。

基本上假设您出于某种原因需要在 2 个版本之间进行非轻量级迁移,在您的情况下为 11 和 12。您需要做的是:

1->12轻量级12->13 自定义迁移13->( future 版本)轻量级迁移

可能有更好的解决方案,但我还没有找到。

这里有一些代码可以帮助你解决问题(最难的部分,我记不住所有内容),在这段代码之前我将数据库复制到一个备份,所以基本上备份数据库是你的旧数据库,而商店是你的新的(空的)

NSString *path = [[NSBundle mainBundle] pathForResource:<YOUR MODEL NAME> ofType:@"cdm"];

NSURL *backUpURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<YOUR MODEL NAME>MigrationBackUp.sqlite"]; //or whatever you want to call your backup
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<YOUR MODEL NAME>.sqlite"];
NSError *err2 = nil;
NSDictionary *sourceMetadata2 =
[NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
URL:backUpURL
error:&err2];
NSManagedObjectModel *sourceModel2 = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]

forStoreMetadata:sourceMetadata2];
NSManagedObjectModel *destinationModel2 = [self managedObjectModelForVersion:@"1.4"]; //Yeah your gonna have to get your mapping model , I'll give you this code too later
NSString *oldModel = [[sourceModel2 versionIdentifiers] anyObject];
NSLog(@"Source Model : %@",oldModel);
NSMappingModel *mappingModel = [[NSMappingModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]];

if (mappingModel != nil) {
for (NSString * identifier in [mappingModel entityMappings]) {
NSLog(@"Mapping > %@",identifier);
}
}

然后只需使用您的源和目标创建一个迁移器。

这也是后面比较难的部分:

    BOOL success = [migrator migrateStoreFromURL:backUpURL
type:NSSQLiteStoreType
options:nil
withMappingModel:mappingModel
toDestinationURL:storeURL
destinationType:NSSQLiteStoreType
destinationOptions:nil
error:&err2];

最后但并非最不重要的(我之前说过我会把它给你):

- (NSManagedObjectModel *)managedObjectModelForVersion:(NSString*)version {

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
if (BETWEEN_INEX(version, @"1.0", @"1.4")) {
modelPath = [modelPath stringByAppendingPathComponent:@"Model"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
} else if (BETWEEN_INEX(version, @"1.4", @"1.5")) {
modelPath = [modelPath stringByAppendingPathComponent:@"Model 2"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
} else if (BETWEEN_INEX(version, @"1.5", @"1.6")) {
modelPath = [modelPath stringByAppendingPathComponent:@"Model 3"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
} else if (BETWEEN_INEX(version, @"1.6", @"1.7")) {
modelPath = [modelPath stringByAppendingPathComponent:@"Model 4"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
}
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
NSManagedObjectModel * oldManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSSet *vIdentifiers = [oldManagedObjectModel versionIdentifiers];
for (NSString * identifier in vIdentifiers) {
NSLog(@"Old Model : %@",identifier);
}
return [oldManagedObjectModel autorelease];

我知道这些只是代码片段,但我真的希望它能帮助您解决问题,如果您需要其他任何东西,请尽管询问。

关于iphone - 核心数据迁移 : methods in NSEntityMigrationPolicy not called.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13493643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com