【问题标题】:Default value for a Relationship in Core DataCore 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"];

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

提前致谢, 托马斯

【问题讨论】:

    标签: objective-c macos cocoa core-data


    【解决方案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!这是一个更好的解决方案!谢谢!
        • 好的,那我就简单回答一下吧!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 2010-12-03
        • 2010-12-19
        • 1970-01-01
        相关资源
        最近更新 更多