Я смог решить эту проблему с помощью конфигураций. Поскольку Magical Record всегда отправляет null
для параметра конфигурации, я разложил setupCoreDataStackWithAutoMigratingSqliteStoreNamed
и заменил его на метод, который поддерживает несколько конфигураций.
Поскольку Magical Record отлично справляется с обработкой автоматических миграций, я сначала вызываю setupCoreDataStackWithAutoMigratingSqliteStoreNamed
, а затем очищает, а затем предоставляю код замены.
У меня есть одна объектная модель с моими объектами семенных данных, которым назначена конфигурация «Семя» и пользовательские объекты, назначенные для конфигурации «Пользователь». Магическая запись уже была инициализирована, поэтому при необходимости можно автоматически выполнить миграцию.
+(void) RB_setupMultipleStores:(NSString *) seedStoreName userStore:(NSString *) userStoreName
/* change persistent store to one with multiple configurations. Assumes Magical Record is initialized. */
{
NSError * error= nil;
[MagicalRecord cleanUp];
NSManagedObjectModel * model = [NSManagedObjectModel MR_defaultManagedObjectModel];
NSURL *seedURL = [NSPersistentStore MR_urlForStoreName:[seedStoreName stringByAppendingString:@".sqlite"]];
NSPersistentStoreCoordinator * coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSPersistentStore * seedStore =[coordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"Seed"
URL:seedURL
options:options
error:&error];
if (!seedStore || error)
{
NSLog(@"Error setting up seed store:%@ for %@", [error localizedDescription], seedURL);
exit(-1);
}
NSURL *userURL = [NSPersistentStore MR_urlForStoreName:[userStoreName stringByAppendingString:@".sqlite"]];
NSPersistentStore * userStore = [coordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"User"
URL:userURL
options:options
error:&error];
if (!userStore || error)
{
NSLog(@"Error setting up user store:%@ for %@", [error localizedDescription], userURL);
exit (-1);
}
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];
[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}
Кроме того, MR 3.0 имеет одновременные стеки, которые могут решить проблему после ее завершения.
Привет @Ron, в каком магазине вы переходите к setupCoreDataStackWithAutoMigratingSqliteStoreNamed, поскольку у вас есть два из них? Тот, у которого нет семени? – DAN