Основные данные - вопрос миграции? - PullRequest
5 голосов
/ 14 апреля 2011

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

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

1.xcdatamodel
2.xcdatamodel

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

1to2.xcmappingmodel

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

* * 1010

Ответы [ 4 ]

5 голосов
/ 09 декабря 2011

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

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

4 голосов
/ 14 апреля 2011

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

- (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;
    }
0 голосов
/ 20 декабря 2012

Если вы передадите nil в качестве параметра bundle, потребуется [NSBundle mainBundle].

[В ответ на вопрос Elise van Looij]

0 голосов
/ 06 мая 2011

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

NSArray *theBundles = [NSArray arrayWithObject:[NSBundle mainBundle]];
    mappingModel = [NSMappingModel mappingModelFromBundles:theBundles
                                            forSourceModel:source 
                                          destinationModel:target];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...