Основные данные отношения потеряли после обновления приложения - PullRequest
4 голосов
/ 13 сентября 2011

У меня сложная проблема, на которую я не могу найти ответ. Моя модель данных имеет следующую структуру:

Версия 1:
Проект имеет много мест
В локации много проектов
Но по ошибке обратная связь между ними никогда не была установлена.

Версия 2:
То же, что и выше, но теперь настроено обратное.

Пример моей проблемы может быть следующим:
В версии 1 у меня есть два проекта, которым принадлежит одно и то же местоположение. Когда я запускаю версию 2 и моя модель отображения обрабатывается, исходный проект, которому принадлежит местоположение, теряет свою связь с этим местоположением, и теперь это местоположение отображается только как часть одного из проектов, а не как оба.

Я понимаю, что эта проблема, вероятно, вызвана тем, что я не установил обратную связь между проектами и местоположениями, но могу ли я что-то сделать, чтобы данные сохранялись в двух версиях приложения / модели данных?

Edit: Я попробовал предполагаемую модель отображения и попытался создать модель отображения вручную. В настоящее время я использую клавишу NSMigratePersistentStoresAutomaticallyOption только когда создал свой NSPersistentStoreCoordinator.

Кроме того, для ясности, у меня есть две версии модели данных, и миграция успешно выполняется, единственная проблема заключается в том, что отношения не сохраняются, как предполагалось.

Редактировать 2: Я понял, что мне нужно будет создать подкласс NSEntityMigrationPolicy. Я не хочу делать полностью пользовательскую миграцию, я бы предпочел, чтобы остальная часть моей миграции была автоматической, если это возможно. Кто-нибудь знает какие-либо хорошие учебные пособия или примеры по созданию подкласса NSEntityMigrationPolicy, которые будут иметь отношение к моей цели? Я не смог найти много, и, насколько я могу судить, в документах Apple очень мало упоминаний об этом.

Редактировать 3: Я не могу понять, как установить обратную связь с помощью NSEntityMigrationPolicy. Моя проблема сейчас немного другая, чем я описал ранее. Кто-нибудь знает какой-нибудь убедительный пример, как это сделать?

Ответы [ 4 ]

3 голосов
/ 16 сентября 2011

Неудачный.

Вам придется выполнить миграцию вручную, создав подкласс NSEntityMigrationPolicy: (

Ознакомьтесь с документацией здесь , в частности, с разделом о пользовательских политиках миграции объектов.

Вы должны будете сами создать обратные отношения как часть миграции.

S

1 голос
/ 16 сентября 2011

Ваша вторая модель случайно изменила отношение «один ко многим»?

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

(это предположение!)

1 голос
/ 13 сентября 2011

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

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


  NSError *error = nil;

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
  if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
  }
0 голосов
/ 31 мая 2012

Для всех, кто сталкивался с этой ситуацией, на самом деле был очень простой ответ, который я не учел.

Я не слишком далеко продвинулся в попытке подкласса NSEntityMigrationPolicy - я не могнайти любой хороший пример кода, который вышел за рамки основ.В определенных ситуациях подклассы NSEntityMigrationPolicy могут быть лучшим решением.Но если вы находитесь в той же ситуации, что и я - (имеется в виду, что вы настроили правильные поля для обратных отношений в вашей модели, но вы забыли указать обратное), я думаю, у меня есть более простое решение.

Вместо подкласса NSEntityMigrationPolicy я сделал следующее (что на самом деле намного проще IMO):

(имейте в виду, что моя модель настроена следующим образом: Проекты <-> Расположение, отношение «имеет-и-принадлежит-многим»)

  1. Я сохранил свой старый файл модели данных (.xcdatamodel) в своем приложении.Когда мое приложение загружается впервые, оно загружает NSManagedObjectModel из старого файла модели данных.Затем я продолжил цикл по всем проектам в моей базе данных и по всем местоположениям для каждого проекта, и для каждого местоположения я бы установил поле «проект» вручную - если я настроил свою модель правильно в первый раз, это было бы завершено автоматически с использованием обратных отношений.Вот как выглядит мой код:

    NSArray *projects = [context executeFetchRequest:request error:&error];
    for(Project *project in projects) {
        for(Location *location in project.locations) {
            // set the inverse relationship manually
            [location addProjectsObject:project];
        }
    }
    
  2. Я спас свой NSManagedObjectContext.

  3. Затем я избавился от своего NSManagedObjectContext, NSManagedObjectModel, NSPersistentStoreCoordinator и перестроил их, используя мой новый файл xcdatamodel.Новый файл модели содержит обратные отношения, и они настроены правильно.При переносе данных из базы данных SQLite все данные сохранялись, и обратные связи, которые я настраивал вручную, все еще сохранялись.При создании нового NSPersistentStoreCoordinator обязательно укажите параметр NSMigratePersistentStoresAutomaticallyOption.

...