【发布时间】:2010-08-30 19:36:32
【问题描述】:
我只有一个托管对象上下文。
我已经修改了托管对象存储。
我想将某些字段添加到每个托管对象中。将它们一一添加到我系统中的每个对象会花费太多时间,因此我决定以编程方式将它们添加到托管对象模型中。在应用程序委托中,我首先这样做:
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
然后我遍历模型中的所有实体并修改它们并为每个实体设置新的属性数组:
for (NSEntityDescription *entity in entities) {
NSAttributeDescription *idAttribute = [[NSAttributeDescription alloc] init];
[idAttribute setName:@"id"];
[idAttribute setAttributeType:NSStringAttributeType];
[idAttribute setOptional:NO];
[idAttribute setIndexed:YES];
等等。
它似乎大部分工作正常。当我尝试将对象添加到我创建的新的一对一关系时遇到问题。我从同一个托管对象上下文创建对象:
self.action = [NSEntityDescription insertNewObjectForEntityForName:@"MobileObjectAction" inManagedObjectContext:managedObjectContext];
self.user = [NSEntityDescription insertNewObjectForEntityForName:@"MobileUser" inManagedObjectContext:managedObjectContext];
当我到达时
[user setAction:action];
我得到: 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'非法尝试在不同上下文中的对象之间建立关系'动作'......
我做错了什么?
【问题讨论】:
-
我认为我的问题可能与用于以编程方式生成的核心数据属性的访问器有关。我想我不能再使用@dynamic,因为核心数据不知道我的属性。我可以使用@synthesize,还是必须自己编写setter 和getter。如果是这样,它们需要看起来像什么?
-
我创建了自己的访问器:- (MobileObjectAction *)action { [self willAccessValueForKey:@"action"]; id action = [self originalValueForKey:@"action"]; [self didAccessValueForKey:@"action"];返回动作; } - (void)setAction:(MobileObjectAction *)action { [self willChangeValueForKey:@"action"]; [self setPrimitiveValue:action forKey:@"action"]; [self didChangeValueForKey:@"action"]; } 但仍然是同样的错误