Core Data 不会触发实体属性的错误,但会触发关系

Posted

技术标签:

【中文标题】Core Data 不会触发实体属性的错误,但会触发关系【英文标题】:Core Data not firing fault for entity properties but does for relationships 【发布时间】:2016-03-01 18:57:23 【问题描述】:

我有一个名为 Trigger 的核心数据实体,它与另一个名为 ActiveTrigger 的实体具有多对一的关系。当我使用[request setReturnsObjectsAsFaults:NO]; 查询触发器对象的核心数据时,查询结果在每个触发器上都有一个 ActiveTrigger 实体的 NSSet,即 trigger.activeTriggers。然而,ActiveTrigger 对象有一个数据错误,当我访问任何属性时不会触发该错误,但当我访问 ActiveTrigger 上的关系之一时会触发。访问属性或关系时不应该触发故障吗?使用关系触发故障后,未触发故障返回后返回的相同属性(null)为实际值。

NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Trigger class])];
[request setPredicate:[NSPredicate predicateWithFormat:@"identifier IN %@", triggerIds]];
[request setReturnsObjectsAsFaults:NO];

NSError * error = nil;
NSArray * results = [[NSManagedObjectContext sharedManagedObjectContext] executeFetchRequest:request error:&error];
for (Trigger * trigger in results) 
    for (ActiveTrigger * activeTrigger in trigger.activeTriggers) 
        NSLog(@"Here is the survey name as a property on the ActiveTrigger 1:  %@", activeTrigger.surveyName);
        NSLog(@"Here is the survey name via the relationship:                  %@", activeTrigger.survey.name);
        NSLog(@"Here is the survey name as a property on the ActiveTrigger 2:  %@", activeTrigger.surveyName);
    



//Here are the logs resulting from the code above
2016-03-01 13:48:28.809 AppName[31787:1480404] Here is the survey name as a property on the ActiveTrigger 1:  (null)
2016-03-01 13:48:28.811 AppName[31787:1480404] Here is the survey name via the relationship:                  All Q
2016-03-01 13:48:28.811 AppName[31787:1480404] Here is the survey name as a property on the ActiveTrigger 2:  All Q

第一个日志后的断点确认activeTrigger对象在尝试访问surveyName属性后仍有数据故障

【问题讨论】:

【参考方案1】:

解决了。事实证明,ActiveTrigger 实现中的属性使用@synthesize 而不是@dynamic。更改为动态,访问属性时正确触发数据错误

【讨论】:

以上是关于Core Data 不会触发实体属性的错误,但会触发关系的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 自动迁移不会在我的新模型中创建新实体

通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误

如何将日期类型保存到 Swift Core Data 中实体的属性?

RestKit / Core Data:远程删除的实体不会从 Core Data 中删除

IOS/objective-c/core-data:如何从相关实体获取属性

Core Data 中父实体的计算属性