Core Data 中关系的默认值

Posted

技术标签:

【中文标题】Core Data 中关系的默认值【英文标题】:Default value for a Relationship in Core Data 【发布时间】:2011-11-12 21:45:18 【问题描述】:

我创建了一个包含两个实体的模型。实体 A 与实体 B 具有(一对一)关系。我的问题是,我不知道如何为该关系设置默认值。如果我向实体 A 添加一个新条目,我会得到关系值的“无值”(发送到相应 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"];

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

提前致谢, 托马斯

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我会创建一个工厂,它会创建 A 的新对象并根据您的需要对其进行预配置。

【讨论】:

【参考方案3】:

好的...我解决了问题(或多或少)。我所做的是将 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 只被调用一次。删除线后我也摆脱了问题

 [context executeFetchRequest:request error:nil];

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

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

【讨论】:

我认为 Awakefrominsert 将是一种更好的覆盖方法。 你好 jrturton!这是一个更好的解决方案!谢谢! 好的,那我就简单回答一下吧!

以上是关于Core Data 中关系的默认值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 git core.preloadindex 默认值为 false?

linux下SO_RCVBUF的默认值

EF Core1.0 CodeFirst为Modell设置默认值!

使用EF Core定义默认值 - OnModelCreating

Entity Framework Core:将可空列迁移到必需时的默认值

在 SWIFT 中关闭 segue 之前保存变量