CoreData轻量级迁移+自定义
问题描述:
我试图归档轻量级迁移后的一些处理。我已经做了轻量级的过程,我现在需要一些帮助来处理我的实体。CoreData轻量级迁移+自定义
在旧模型上,我曾经有一个实体“汽车”,现在我添加实体“人”的关系人有汽车。
因此,轻量级迁移后,我需要添加一个默认的人“约翰”,并添加所有的汽车给他。
有没有人有一些想法?
- (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;
}
答
如果轻量级迁移即将发生,您可以捕获。详情请见this回答。在那里你可以设置一个标志,并在正常启动之后执行一个方法,插入所需的实体。
注意,虽然,轻量级迁移需要迁移的所有现有实体新店版本,所以通常有没有逻辑上令人信服的理由用这个钩子。相反,如果包含“约翰”和他的汽车,并且如果不包含,他们会冷查询您的(新版或旧版)商店。
答
如果这是对数据库的一次性升级,那么使用custom migration policy class而非轻量级迁移可能是有意义的。下面是如何定制过程一个很好的教程: http://9elements.com/io/index.php/customizing-core-data-migrations/
如果你想那么从一对与另一对模型之间的自定义迁移模型混合推断迁移,我写了一个description of the Core Data methods involved和样品iterative migration class。
感谢您的帮助。如果将来我做了我的模型的另一个版本呢?有什么方法可以跟踪?就像,如果我升级到V2插入约翰,如果升级到V3插入文森特? – 2013-05-09 16:14:07
是的,您可以随时查询“NSObjectModel”的版本,如其他答案中所述。 – Mundi 2013-05-09 22:45:28