Нужно ли вручную устанавливать обратное отношение базового объекта данных в коде на iPhone - PullRequest
5 голосов
/ 14 июля 2011

Я новичок в основных данных, поэтому извините, если я неправильно понял некоторые термины.

В моем файле xcdatamodel есть несколько объектов.Все они взаимосвязаны с отношениями и обратными отношениями.Если я соединю два из этих объектов с помощью следующего кода, обратное отношение не будет установлено.

[managedObj1 setValue: managedObj2 forKey:@"relatiohipName"]; 

Мне кажется, мне нужно вручную установить обратное отношение с помощью следующего кода

[managedObj1 setValue: managedObj2 forKey:@"relatiohipName"];
[managedObj2 setValue: managedObj1 forKey:@"inverseRelatiohipName"];

Это кажется мне неправильным, но это единственный способ заставить механизм работать.Я посмотрел на базу данных sqlite после запуска первого блока кода, и обратная связь не заполняется, но если я запускаю второй код, связь есть.

Кроме того, создается впечатление, что когда я создаю объектв основных данных я не могу изменить его после этого.ДП остается прежним.Когда я выхожу из приложения и перезапускаю его, я, похоже, теряю все связи и атрибуты объекта.Полученные объекты в моем коде имеют только переменные-члены, равные nil.

РЕДАКТИРОВАТЬ:

Закомментированные вещи - это то, как это было сделано раньше, а некомментированные вещи - какЯ делаю это сейчас без удачи.

Здесь я создаю объекты:

NSEntityDescription* mobileEntity = [NSEntityDescription entityForName:@"WebServiceAuthService_mobileAdvertisementVO" inManagedObjectContext:managedObjectContext];
WebServiceAuthService_mobileAdvertisementVO *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mobileEntity name] inManagedObjectContext:managedObjectContext];
//WebServiceAuthService_mobileAdvertisementVO *newObject = [NSEntityDescription insertNewObjectForEntityForName:@"WebServiceAuthService_mobileAdvertisementVO" inManagedObjectContext:managedObjectContext];    

Здесь я назначаю одну из переменных-членов объектов:

[self setValue:newChild forKey:@"advertisement"];
            //self.advertisement = newChild;

Здесь я сохраняю контекст:

NSError *error = nil;
if (managedObjectContext != nil) 
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
    {
        DLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

}

Ответы [ 2 ]

6 голосов
/ 14 июля 2011

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

Мне кажется, что на самом деле ваши объекты не вставлены в объект NSManagedObjectContext. Контекст - это то, что «управляет» объектами и делает такие вещи, как автоматическая установка отношений. Контекст также является тем, что записывает объекты в постоянное хранилище.

1 голос
/ 16 июля 2011

Важный совет по безопасности. Если вы подкласс NSManagedObject, НЕ используйте @synthesize для ваших переменных-членов. Вместо этого используйте @dynamic.

...