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?
EF Core1.0 CodeFirst为Modell设置默认值!
使用EF Core定义默认值 - OnModelCreating