我在 iPhone 上使用 Core Data,是否需要在代码中手动设置对象的反向关系?

7

我对core data比较新,如果术语有误请谅解。

我的xcdatamodel文件中有几个对象。它们都通过关系和反向关系相互连接。如果我使用以下代码连接这些对象中的两个,则反向关系不会被设置。

[managedObj1 setValue: managedObj2 forKey:@"relatiohipName"]; 

我似乎需要手动使用以下代码设置反向关系

[managedObj1 setValue: managedObj2 forKey:@"relatiohipName"];
[managedObj2 setValue: managedObj1 forKey:@"inverseRelatiohipName"];

这对我来说似乎是错误的,但这是我唯一能让机制工作的方法。在运行第一段代码后,我查看了sqlite数据库,发现反向关系没有填充,但如果我运行第二段代码,则关系就存在了。
另外,似乎一旦我在Core Data中创建了一个对象,就无法在那之后更改它。dp保持不变。一旦我退出应用程序并重新启动它,似乎我会失去对象的所有关系和属性,我的代码中生成的对象只有空成员变量。
编辑:
注释掉的内容是以前的做法,取消注释的内容是我现在的做法,但没有成功。
以下是我创建对象的位置:
NSEntityDescription* mobileEntity = [NSEntityDescription entityForName:@"WebServiceAuthService_mobileAdvertisementVO" inManagedObjectContext:managedObjectContext];
WebServiceAuthService_mobileAdvertisementVO *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mobileEntity name] inManagedObjectContext:managedObjectContext];
//WebServiceAuthService_mobileAdvertisementVO *newObject = [NSEntityDescription insertNewObjectForEntityForName:@"WebServiceAuthService_mobileAdvertisementVO" inManagedObjectContext:managedObjectContext];    

这里是我给对象的一个成员变量赋值的地方:

[self setValue:newChild forKey:@"advertisement"];
            //self.advertisement = newChild;

这里是我保存上下文的地方:

NSError *error = nil;
if (managedObjectContext != nil) 
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
    {
        DLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

}

4
你的Shift键坏了吗?在短信中不使用大写和标点符号可能还好,但是在段落中阅读将变得困难。我已经编辑了帖子,但今后请花时间使你的问题易于他人阅读。很多人会放弃阅读这样懒散写作风格的问题。 - TechZen
2个回答

9

如果在数据模型中没有设置相互关系,那么您必须手动设置关系的双方。如果设置了相互关系,那么自动分配关系的一侧将自动分配另一侧。这是数据模型的一个功能。

听起来您似乎没有将对象插入NSManagedObjectContext对象中。上下文是“管理”对象并执行诸如自动关系设置之类的操作的内容。上下文还会将对象写入持久存储器。


如果它们没有被插入,你会认为它们不会出现在 SQLite 数据库中。 - iHorse
我不太确定它们是否存在,特别是如果它们在重新启动后消失。直接查看SQL对于了解Core Data的实际操作非常有限,因为SQL并不是其功能的核心。我建议您发布创建托管对象和保存上下文的代码。显然,这里发生了一些不寻常的事情。 - TechZen
检查您的构建,确保您没有得到多个数据模型文件。如果您实际上正在使用一个没有关系的模型文件,而您认为您正在使用一个具有关系的模型文件,则会导致此问题。 - TechZen
SQL文件不是持久存储保存和读取数据的地方吗?我同意有些奇怪的事情正在发生。我知道在哪里寻找问题。如果结果证明无果,我会回来的。 - iHorse
好的。那么你有什么建议呢?我已经没有主意了。我读过的所有资料都说我做得对,但它还是不起作用。 - iHorse
显示剩余2条评论

1

重要的安全提示。如果你子类化了NSManagedObject,请不要使用@synthesize来定义你的成员变量,而应该使用@dynamic。


哈!以前从未遇到过这种情况!甚至没有想到过。合成的访问器不会正确触发上下文的KVO。 - TechZen
我知道。我看到的所有Core Data示例都没有提到使用@dynamic。我找到的唯一方法是让Xcode从xcdatamodel文件生成类文件。 - iHorse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接