Как правильно обновить модель в Xcode4, не повреждая ее? - PullRequest
1 голос
/ 17 июля 2011

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

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

  1. NSPersistentDocument, из шаблона Apple
  2. Переопределить метод загрузки моделей Apple,и единственное, что я делаю, это задаю два флага в словаре storeOptions, которые включают автоматическую миграцию
-(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 с именем «нечто.xcdatamodel», с поворотом слева)
  2. Перейдите в меню редактора, выберите «Добавить новую модель»версия ... "
  3. Назовите новую версию 1 целым числом выше, чем в прошлом - например, если предыдущим было" 4 ", назовите новое" 5 "
  4. В правой панели изменитетекущая версия модели для вновь созданной
  5. обходной путь для ошибки XCode4 : выберите любой файл, затем выберите вновь созданную модель.Если вы этого не сделаете, XCode показывает выбор на вновь созданной модели, но вместо этого отредактирует предыдущую модель, что определенно повреждает все в CoreData
  6. Редактируйте вашу модель;в этом случае я добавляю новый атрибут к существующей сущности
  7. Сохранить.Построить.Запустить.... CRASH.

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

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


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

Ответы [ 3 ]

3 голосов
/ 22 ноября 2012

Используйте [NSNumber numberWithBool:YES], а не @"YES" или @"TRUE".

0 голосов
/ 05 июня 2013

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

-(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];
}
0 голосов
/ 26 июля 2011

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

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

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

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