CoreData - 关系的一方总是零

时间:2013-04-15 14:44:06

标签: iphone ios core-data nsmanagedobject nsmanagedobjectcontext

我有一个CoreData项目,其中有两个相关的实体(用户和研究),这些实体与另一个实体(UserStudy)有一对多的关系,它与第一个实体之间具有一对一的关系两个实体,以及一些其他属性。

我遇到了一个非常奇怪的问题。我可以将UserStudy添加到用户和研究的集合中,但关系的另一面永远不会起作用。每次我设置它,我都没有错误,这种关系只是空的。

  1. 我已经使用相同的代码创建了一个测试项目,它出于某种原因在那里工作,但不是在我一岁的项目中(大型代码库我不能简单地丢弃)
  2. 我已经清理了
  3. 我已删除派生数据
  4. 我尝试使用点访问器,便捷设置器和使用setValue设置关系:ForKey。
  5. 我已经确认所有反向关系都已正确设置。
  6. 我已经确认用户和学习方面的关系是一对多的,并且在UserStudy方面是一对一的关系。
  7. 我尝试设置关系的代码如下:

    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];
    

    关系设定,但另一方面仍为零。

    就像我说的,我可以将我的模型代码复制粘贴到一个新项目中,一切正常。有没有人经历过这个?也许它与测试目标有关?

1 个答案:

答案 0 :(得分:1)

我仍然不知道这个问题的具体原因是什么,我假设我的.xcdatamodeld文件以某种方式被破坏了。

我已经尝试删除UserStudy实体,并重新创建它,没有运气。

然后我创建了一个新的模型版本。
我没有将此新版本设置为当前默认版本。这并没有解决问题。

然后我再次删除并重新创建了UserStudy实体。
突然间,一切都开始起作用了。

所以我假设创建新的模型版本导致XCode重新生成我的模型文件,并修复导致问题的任何损坏。注意,我在旧模型文件和新模型文件上运行了差异,没有任何东西看起来有什么不同,所以我不知道实际问题是什么,除了模型必须以某种方式损坏。