【问题标题】:CoreData - One side of relationship is always nilCoreData - 关系的一侧始终为零
【发布时间】:2013-04-15 14:44:06
【问题描述】:

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

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

  1. 我已经使用相同的代码创建了一个测试项目,由于某种原因它可以在那里工作,但在我一年前的项目中却不行(大型代码库我不能简单地丢弃)
  2. 我已经打扫过了
  3. 我已经删除了派生数据
  4. 我尝试使用点访问器、便利设置器和 setValue:ForKey 设置关系。
  5. 我已验证所有反向关系均已正确设置。
  6. 我已经验证了这种关系在 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];

关系已确定,但另一边仍然为零。

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

【问题讨论】:

  • 你在这个项目中有迁移吗?如果是这样,您确定将具有正确关系的迁移设置为当前模型版本
  • 没有迁移,这个应用还没有看到生产版本,所以我们只是在更改模型时删除安装
  • 你检查过你的反向关系吗?从研究到用户?
  • 是的,我已经在我检查过的编号列表中说过了

标签: iphone ios core-data nsmanagedobject nsmanagedobjectcontext


【解决方案1】:

我仍然不知道这个问题的具体原因是什么,我假设我的 .xcdatamodeld 文件不知何故损坏了。

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

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

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

所以我假设创建新模型版本导致 XCode 重新生成我的模型文件,并修复导致问题的任何损坏。请注意,我对旧模型文件和新模型文件进行了比较,似乎没有什么不同,所以除了模型一定已经以某种方式损坏之外,我不知道实际问题是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2014-02-20
    • 2016-05-02
    • 2012-01-16
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多