【问题标题】:Open a CoreData store with a specific (non current) MOM version打开具有特定(非当前)MOM 版本的 CoreData 存储
【发布时间】:2012-11-13 14:22:28
【问题描述】:

我在 CoreData 模型版本中有多种破坏性架构更改。由于本地架构只是网络数据的缓存,我很乐意删除 sqlite 文件并强制重新下载此版本的 iOS 应用程序。

不过……

数据库中有一个实体由用户写入,不应丢失。

在新版本的应用程序中,这些易失性数据不再写入 CoreData 存储,而是记录在文件系统中。

我正在逐步进行,以便(比如说)2.0.1 版应用程序使用 v1 架构并复制数据,但没有破坏性架构更改,然后是 2.0.2 版应用程序可以添加架构更改并删除数据库,知道数据已被删除是安全的,但由于应用商店更新的工作方式,无法保证用户从 .0-.1-.2 开始。他们可能会直接从 .0 升级到 .2,并在尝试打开核心数据存储时遇到重大更改。

任何想法、指点、建议表示赞赏。

更新:我想知道“伪造”迁移是否可行。一种自定义迁移策略,它忽略除易失性数据之外的所有内容并且实际上不迁移它,只是将其写入文件系统。运行后,我将在文件系统中拥有易失性数据和基于新架构的空数据库。

【问题讨论】:

    标签: ios core-data core-data-migration


    【解决方案1】:

    我还认为你可能会更好地伪造迁移,这里有一些代码可以让你想要的那个妈妈。只需将 EntryModel 替换为您的模型名称,然后调整版本即可。然后使用 NSPersistentStoreCoordinator 上的“-(id)initWithManagedObjectModel”方法来获取你想要的模型上的商店协调器。

    - (NSManagedObjectModel *)managedObjectModelForVersion:(NSString*)version {
    
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"EntryModel" ofType:@"momd"];
    if (BETWEEN_INEX(version, @"1.0", @"1.4")) {
        modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel"];
        modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
    } else if (BETWEEN_INEX(version, @"1.4", @"1.5")) {
        modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 2"];
        modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
    } else if (BETWEEN_INEX(version, @"1.5", @"1.6")) {
        modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 3"];
        modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
    } else if (BETWEEN_INEX(version, @"1.6", @"1.7")) {
        modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 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];
    }
    

    这也可能有用:

    #define GREATER_THAN(w,v)              ([w compare:v options:NSNumericSearch] == NSOrderedDescending)
    #define GREATER_THAN_OR_EQUAL_TO(w,v)  ([w compare:v options:NSNumericSearch] != NSOrderedAscending)
    #define LESS_THAN(w,v)                 ([w compare:v options:NSNumericSearch] == NSOrderedAscending)
    #define LESS_THAN_OR_EQUAL_TO(w,v)     ([w compare:v options:NSNumericSearch] != NSOrderedDescending)
    #define BETWEEN_INCLUDE(w,v,z)     (GREATER_THAN_OR_EQUAL_TO(w,v) && LESS_THAN_OR_EQUAL_TO(w,z))
    #define BETWEEN_EXCLUDE(w,v,z)     (GREATER_THAN(w,v) && LESS_THAN(w,z))
    #define BETWEEN_INEX(w,v,z)     (GREATER_THAN_OR_EQUAL_TO(w,v) && LESS_THAN(w,z))
    #define BETWEEN_EXIN(w,v,z)     (GREATER_THAN(w,v) && LESS_THAN_OR_EQUAL_TO(w,z))
    

    【讨论】:

    • 抱歉耽搁了。由于某种原因,我只看到了这个回复。幸运的是,这基本上就是我所做的:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2014-02-23
    • 2020-03-27
    • 2011-05-21
    相关资源
    最近更新 更多