CoreData 轻量级迁移 + 自定义

Posted

技术标签:

【中文标题】CoreData 轻量级迁移 + 自定义【英文标题】:CoreData Lightweight Migration + Custom 【发布时间】:2013-05-09 01:47:27 【问题描述】:

我正在尝试归档一个轻量级迁移,然后进行一些处理。我已经完成了轻量级流程,现在我需要一些帮助来处理我的实体。

在旧模型上,我曾经有一个实体“Car”,现在我添加了实体“Person”,关系为 Person has Cars。

所以,在轻量级迁移之后,我需要添加一个默认人“John”并将所有汽车添加给他。

有人知道吗?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

    if (_persistentStoreCoordinator != nil) 
        return _persistentStoreCoordinator;
    

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

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


    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    

    return _persistentStoreCoordinator;

【问题讨论】:

【参考方案1】:

如果要发生轻量级迁移,您可以捕捉到。有关详细信息,请参阅this 答案。在那里,您可以设置一个标志,并基于该标志在正常启动后执行一个方法,您可以在其中插入所需的实体。

但请注意,轻量级迁移应该将所有现有实体迁移到新的商店版本,因此通常没有合乎逻辑的理由使用此挂钩。相反,您只需查询您的(新版本或旧版本)商店是否包含“约翰”和他的汽车,如果没有则插入它们。

【讨论】:

感谢您的帮助。如果将来我做另一个版本的模型怎么办?有什么方法可以追踪吗?比如,如果我升级到 v2 插入 John,如果升级到 v3 插入 Vincent? 是的,您可以随时查询 NSObjectModel 以获取其他答案中所述的版本。【参考方案2】:

如果这是对数据库的一次性升级,使用custom migration policy class 而不是轻量级迁移可能更有意义。这是一个关于自定义该过程的很好的教程: http://9elements.com/io/index.php/customizing-core-data-migrations/

如果您想将一对模型的推断迁移与另一对模型之间的自定义迁移混合使用,我编写了description of the Core Data methods involved 和示例iterative migration class。

【讨论】:

以上是关于CoreData 轻量级迁移 + 自定义的主要内容,如果未能解决你的问题,请参考以下文章

coredata 通过检测版本自定义迁移

CoreData 类的自定义方法

CoreData 的自定义 UID 数据类型

如何在Coredata中存储自定义结构数组[关闭]

CoreData:将 MagicalRecord 与 FetchedResultsController 和自定义 sortDescriptor 一起使用

CoreData 可转换:自定义转换器永远不会被调用 - 使用 NSKeyedArchiver