хорошо ... Я решил проблему (более или менее).Что я сделал, это подкласс 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];
Этого также не происходит, если выборка вызывается только один раз, как в первом примере кода, где я храню запись в статическойпеременная.
Кто-нибудь знает, что там происходит ??