Значение по умолчанию для отношения в базовых данных - PullRequest
0 голосов
/ 13 ноября 2011

Я создал модель с двумя объектами. У объекта A есть отношение (к-одному) к объекту B. Моя проблема в том, что я понятия не имею, как установить значение по умолчанию для отношения. Если я добавляю новую запись в AI объекта, получим «нет значения» для значения отношения (действие, отправленное соответствующему NSArrayControler или [newObjectEntityA initWithEntity: ....]. Мне не хватает способа назначить значение по умолчанию для отношений, как для атрибутов.

Пример:

Entity A
attrib a (has a default value)
attrib b (has a default value)
relation to B (has no default value)

Конечно, обходной путь - это что-то вроде этого:

[newObjectEntityA setValue: defaultValueInEntityB forKey:@"relationToB"];

но я думаю, что должно быть более удобное решение.

Спасибо заранее, Thomas

Ответы [ 3 ]

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

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

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

Я бы создал Фабрику, которая создаст новые объекты А и предварительно сконфигурирует ее в соответствии с вашими потребностями.

0 голосов
/ 16 ноября 2011

хорошо ... Я решил проблему (более или менее).Что я сделал, это подкласс NSManagedObject, и я переопределил метод - (void) initWithEntity: insertIntoManagedObjectContext:

@implementation Locos 
static NSManagedObject *defaultType;

- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
{
    self=[super initWithEntity:entity insertIntoManagedObjectContext:context];

    if(self==nil) 
    {
        [self release];
        return(nil);
    }

    if(defaultType==nil)
    {
        NSEntityDescription* locoType=[NSEntityDescription entityForName:@"LocoType" inManagedObjectContext:context];
        if(locoType==nil) return(self);

        NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
        [request setEntity:locoType];
        NSPredicate *predicate=[NSPredicate predicateWithFormat:@"Default==TRUE"];
        [request setPredicate:predicate];
        [context executeFetchRequest:request error:nil];

        NSArray *array=[context executeFetchRequest:request error:nil];

        defaultType=[array objectAtIndex:0];
    }

    if(defaultType!=nil)
    {
        [self setPrimitiveValue: defaultType forKey:@"Type"];   
    }

    return(self);
}
@end

Он устанавливает отношение «Тип» в сущности «Locos» к первой записи в сущности«LocoType» с атрибутом «Default», установленным в «true».Это работает, но есть кое-что, чего я не понимаю.Я получаю очень странный эффект, если упростить метод до:

@implementation Locos 

- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
{
    self=[super initWithEntity:entity insertIntoManagedObjectContext:context];

    if(self==nil) 
    {
        [self release];
        return(nil);
    }

    NSEntityDescription* locoType=[NSEntityDescription entityForName:@"LocoType" inManagedObjectContext:context];
    if(locoType==nil) return(self);

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:locoType];
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"Default==TRUE"];
    [request setPredicate:predicate];
    [context executeFetchRequest:request error:nil];

    NSArray *array=[context executeFetchRequest:request error:nil];

    [self setPrimitiveValue: [array objectAtIndex:0] forKey:@"Type"];   

    return(self);
}
@end

в этом случае, если я нажму кнопку, которая обязательно добавит: контроллера массива (который связан с сущностью 'Locos') Я всегда получаю две новые записи!Я запускаю отладчик и метод initWithEntry вызывается только ОДИН РАЗ.Я также избавляюсь от проблемы, как только удаляю строку

 [context executeFetchRequest:request error:nil];

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

Кто-нибудь знает, что там происходит ??

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