CoreData:检查Null

时间:2009-08-24 22:44:06

标签: iphone objective-c cocoa cocoa-touch core-data

我有一个CoreData实体(waypoint),其外键是另一个实体(track)。设置外键或未设置外键时,此if语句正常工作:

if ([wp track]) {
  thirdLabel.text = [NSString stringWithFormat:@"Part of Track: %@", [[wp track] title]];
}   

但是,如果已删除航点被键入的轨道,则[wp track]仍会评估为true,并且当我设置标签文本时程序崩溃。

那么,我如何在CoreData中正确检查这个“已被删除”的空值?

2 个答案:

答案 0 :(得分:6)

听起来你有单向关系的问题。在“单向关系”

下更详细地给出了您所描述的问题here

基本上,你的航路点无法知道轨道是从它下面删除的。建议的解决方案是将关系建模为双向关系,这样可以使Core Data保持模型的一致性。

在您的具体示例中,如果您的“track”对象与“waypoint”之间存在反向关系,那么当您删除“track”对象时,Core Data将知道更新航点以消除任何悬空关系。有关这方面的更多信息也可以在上面的链接中看到。

答案 1 :(得分:0)

将消息发送到nil是有效的Objective-C。您需要将if谓词修改为:

if (wp != nil && [wp track]) {
    //...
}

您还可以检查对象的retainCount,该对象在取消分配对象时可能会返回0或崩溃。

在任何一种情况下,最好向被摧毁wp的任何人发送某些通知给那些有兴趣使用它的人,或至少保留wp直到你完成它之后在这段代码中。