Как правильно обновить модель в Xcode4, не повредив ее?

У меня никогда не было проблем с Xcode3, но с Xcode4 я получаю сбой кода Apple примерно 1 раз в 3, когда я обновляю базовую модель данных, с ужасающим "Ошибка переноса постоянного хранилища, отсутствует исходная модель управляемого объекта". ошибка.

Вот мои настройки (как я настроил проект для автоматической миграции):

  1. NSPersistentDocument, из шаблона Apple
  2. Переопределите метод загрузки моделей Apple, и ЕДИНСТВЕННАЯ вещь, которую я делаю, это предоставление двух флагов в Словаре store Options, которые включают автоматическую миграцию
-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{

    NSMutableDictionary *newOptions = nil;

    if( storeOptions != nil )
        newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions];
    else
        newOptions = [NSMutableDictionary dictionary];

    [newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption];
    [newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption];

    BOOL success = FALSE;

    success = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error];

    return success;
}

Вот процесс, который я использовал (который уже работает над 1 ошибкой в ​​Xcode4!)

  1. Выберите модель (в Xcode4 с именем "thing.xcdatamodel ", с поворотом слева)
  2. Зайдите в меню редактора, выберите "Добавить новую версию модели..."
  3. Назовите новую версию на 1 целое число выше, чем в прошлом - например, если предыдущая была "4", назовите новую "5"
  4. В правой панели измените текущую версию модели на вновь созданную.
  5. Обходной путь для ошибки XCode4: выберите любой файл, затем выберите вновь созданную модель. Если вы этого не сделаете, Xcode покажет выбор на вновь созданной модели, но вместо этого отредактирует предыдущую модель, что определенно повреждает все в CoreData
  6. Отредактируйте вашу модель; в этом случае я добавляю новый атрибут к существующей сущности
  7. Сохранить. Построить. Запустить. ... CRASH.

За исключением, как я уже сказал, примерно 2 раза в 3 это работает правильно. Как только он сработает один раз, это (очевидно) нормально - облегченная миграция завершена, следующее сохранение сохраняется в новой версии модели.

Так что я предполагаю, что я что-то не так делаю на предыдущих этапах, но я просмотрел документы 5 или 6 раз и не вижу ничего очевидного. Не помогает, что все документы NSPersistentDocument устарели - но я много раз делал облегченную миграцию на iPhone, поэтому я достаточно уверен в этом, и мне это кажется правильным.


Другие вещи, которые я пробовал / проверял: - Ошибка переноса данных ядра iPhone на какао 134130: не удается найти модель для исходного хранилища (нет; был включен только корневой xcdatamodel)

3 ответа

Использование [NSNumber numberWithBool:YES] не @"YES" или же @"TRUE",

Так как вы устранили поврежденное хранилище разработки как источник проблемы, я подозреваю, что проблема лежит в Xcode 4.x, который, по меньшей мере, содержит ошибки. Многие люди сообщают о похожих проблемах, но никакие две проблемы не кажутся абсолютно одинаковыми. Вероятно, это ошибка, возникающая только при определенных настройках модели данных, поэтому эту проблему будет очень трудно отследить.

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

Если у вас есть приложение для доставки и вы будете иметь дело с данными конечного пользователя, у вас есть моральное и деловое обязательство предпринять дополнительный шаг для защиты данных конечного пользователя.

Я был очень смущен, но это, и это НЕ БЫЛО работать.. потому что я предполагал, что метод уже ИМЕЕТ словарь "опций магазина"... Мне просто нужно было проверить его существование, прежде чем я установил вышеупомянутые параметры...

-(BOOL)configurePersistentStoreCoordinatorForURL:       (NSURL*)u
                                          ofType:    (NSString*)t
                              modelConfiguration:    (NSString*)c
                                    storeOptions:(NSDictionary*)o 
                                           error:    (NSError**)e 
{  
 return [super configurePersistentStoreCoordinatorForURL:u
                                                  ofType:t
                                      modelConfiguration:c
                                            storeOptions:
    o ? [o dictionaryWithValuesForKeys:
         @[ NSMigratePersistentStoresAutomaticallyOption, @YES,  
            NSInferMappingModelAutomaticallyOption,       @YES]] 
      :  @{ NSMigratePersistentStoresAutomaticallyOption :@YES,
            NSInferMappingModelAutomaticallyOption       :@YES}
                                                  error:e];
}
Другие вопросы по тегам