Основные данные — вопрос о переносе?

Я пытаюсь выполнить миграцию

У меня есть 2 версии модели

1.xcdatamodel
2.xcdatamodel

Я создал модель сопоставления с версии 1 по 2.

1to2.xcmappingmodel

Проблема в том, что он не может найти модель миграции, которую я создал, поэтому mapModel всегда получает nil. Есть ли что-нибудь, что я должен сделать, чтобы указать, какую модель отображения следует использовать?

target = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
//target and source are initialized correctly
mappingModel = [NSMappingModel mappingModelFromBundles:nil forSourceModel:source destinationModel:target];

person aryaxt    schedule 13.04.2011    source источник


Ответы (4)


Если вы уже создали модель сопоставления из 1.xcdatamodel в 2.xcdatamodel и правильно ее настроили, вы сможете сделать что-то вроде этого: [Примечание: ключ указывает NSMigratePersistentStoresAutomaticallyOption]

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
    if (persistentStoreCoordinator)
        return persistentStoreCoordinator;

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyStore.sqlite"]];

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

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];

   if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                        configuration:nil
                                        URL:storeUrl
                                        options:options
                                        error:&error])
        {
        // Handle error
        NSLog(@"Error adding persistent store...%@", error);
        // Handle the error. 
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0)
            {
            for(NSError* detailedError in detailedErrors)
                {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
                }
            }
        else
            {
            NSLog(@"  %@", [error userInfo]);
            }

        }
    else
        {
        DLog(@"Persistent store added without incident, apparently.");
        }

    return persistentStoreCoordinator;
    }
person westsider    schedule 14.04.2011
comment
Очень интересно, завтра попробую и отпишусь, спасибо - person aryaxt; 14.04.2011

Возможно, вы изменили одну из своих моделей после создания модели сопоставления.

Даже если изменение кажется неуместным, оно изменит значение хеш-функции модели, которая используется для поиска подходящей модели сопоставления. По крайней мере, я только что был укушен этим :-)

person Thorsten    schedule 09.12.2011
comment
Это укусило меня. Я добавил новое поле в целевую модель (после создания модели сопоставления), и весь процесс миграции остановился. Вернемся к модели и изменим модель «назначения» на ту же, что и источник, а затем снова переделаем хэши, и после этого начнется миграция. - person Jaysen Marais; 17.02.2012
comment
Это должен быть принятый ответ. Он отвечает на вопрос, о чем спрашивали. - person Yuchen; 03.03.2015

Чтобы ответить на первоначальный вопрос, ваш код выглядит нормально, но я не причина, по которой вы передали ноль в качестве параметра пакетов. В документации не сказано, что можно. Так:

NSArray *theBundles = [NSArray arrayWithObject:[NSBundle mainBundle]];
    mappingModel = [NSMappingModel mappingModelFromBundles:theBundles
                                            forSourceModel:source 
                                          destinationModel:target];
person Elise van Looij    schedule 06.05.2011
comment
На самом деле в документации сказано, что вы можете передать nil: developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/. - person David Hunt; 26.02.2013
comment
Темпус беглец. В наши дни это так, да. - person Elise van Looij; 26.03.2013

Если вы передадите nil в качестве параметра пакета, он примет значение [NSBundle mainBundle].

[Ответ на вопрос Элизы ван Лоой]

person Duyen-Hoa    schedule 20.12.2012