核心数据中关系的默认值

时间:2011-11-12 21:45:18

标签: objective-c macos cocoa core-data

我创建了一个包含两个实体的模型。实体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"];

但我认为必须有一个更方便的解决方案。

提前致谢, 托马斯

3 个答案:

答案 0 :(得分:3)

您应该覆盖awakeFromInsert,此方法旨在添加默认值和其他启动操作。

答案 1 :(得分:1)

我会创建一个Factory,它创建A的新对象并根据您的需要预先配置它。

答案 2 :(得分:0)

好吧......我解决了问题(或多或少)。我所做的是继承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”中的“Type”关系设置为实体“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只被调用ONCE。我删除行

后也会解决问题
 [context executeFetchRequest:request error:nil];

如果仅在第一个代码示例中调用fetch,也不会发生这种情况,我将记录存储在静态变量中。

有人知道那里发生了什么吗?