我有一个 CoreData 项目,其中有两个相关实体(用户和研究),这些实体与另一个实体(UserStudy)具有一对多的关系,而另一个实体与前两个实体中的每一个都具有一对一的关系,和一些额外的属性。
我遇到了一个非常奇怪的问题。我可以将 UserStudy 添加到用户和研究的集合中,但关系的另一端永远不会起作用。每次我设置它时,我都没有错误,而且关系只是空的。
- 我已经使用相同的代码创建了一个测试项目,它出于某种原因在那里工作,但在我一年前的项目中没有(大型代码库我不能简单地丢弃)
- 我已经打扫过了
- 我已经删除了派生数据
- 我尝试使用点访问器、便利设置器和 setValue:ForKey 设置关系。
- 我已验证所有反向关系均已正确设置。
- 我已经验证了这种关系在 User 和 Study 方面是一对多的,而在 UserStudy 方面是一对一的。
我尝试设置关系的代码如下所示:
CRMUser *aUser = [NSEntityDescription insertNewObjectForEntityForName:@"CRMUser"
inManagedObjectContext:self.ctx];
CRMStudy *aStudy = [NSEntityDescription insertNewObjectForEntityForName:@"CRMStudy"
inManagedObjectContext:self.ctx];
CRMUserStudy *aUserStudy = [NSEntityDescription insertNewObjectForEntityForName:@"CRMUserStudy"
inManagedObjectContext:self.ctx];
aUserStudy.study = aStudy;
aUserStudy.user = aUser;
STAssertTrue([aUserStudy.user isEqual:aUser], @"newUserStudyWithUser:study:token failed to set user");
STAssertTrue([aUserStudy.study isEqual:aStudy], @"newUserStudyWithUser:study:token failed to set study");
NSLog(@"aUserStudy: %@",aUserStudy);
总是失败,并给了我这个日志:
aUserStudy: <CRMUserStudy: 0xa6db8e0> (entity: CRMUserStudy; id: 0xa6dc580 <x-coredata:///CRMUserStudy/t1BDB3E8A-F5F0-4462-AB88-C5186AC4D8C671> ; data: {
study = nil;
token = nil;
user = nil;
})
但如果我这样做:
CRMUser *aUser = [NSEntityDescription insertNewObjectForEntityForName:@"CRMUser"
inManagedObjectContext:self.ctx];
CRMStudy *aStudy = [NSEntityDescription insertNewObjectForEntityForName:@"CRMStudy"
inManagedObjectContext:self.ctx];
CRMUserStudy *aUserStudy = [NSEntityDescription insertNewObjectForEntityForName:@"CRMUserStudy"
inManagedObjectContext:self.ctx];
[aUser addUserStudyObject:aUserStudy];
[aStudy addUserStudyObject:aUserStudy];
关系已经确定,但在另一边仍然为零。
就像我说的,我可以将我的模型代码复制粘贴到一个新项目中,一切正常。有没有人经历过这个?也许它与测试目标有关?