NSPredicate与继承的许多关系

时间:2013-01-27 19:45:30

标签: ios cocoa-touch core-data nspredicate

我正在开发一个我有Post对象的应用程序,每个帖子可以有很多实体(提及,主题标签和链接),每个实体都有一个帖子。我有一个Entity主类,然后我有三个子类。

Mention : Entity

我的提及类具有以下属性:

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * userId; 

我现在想创建一个NSPredicate,找到所有提及某个用户和userId的帖子,我不知道该怎么做。

我尝试过这样的事情:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY mentions.userId like %@",  [Session currentUser].userId];
// That doesn't work since Post(s) have many entities and not Mention(s).
// I have also tried something like this:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY entities.mentions.userId like %@",  [Session currentUser].userId];
// And that didn't work either. 

关于我最好的方法的任何想法应该找到所有提及特定userId的特定用户的帖子?

1 个答案:

答案 0 :(得分:1)

继承是存在的,因此您不必两次编写相等的属性。否则,具有父对象的托管对象就像其他托管对象一样。

因此,您应该为您的帖子提供三种关系:

Post
 hashes   Hash        
 mentions Mention     
 links    Link        

然后你的问题就变得微不足道了:

[NSPredicate predicateWithFormat:@"ANY hashes.userID = %@", _currentUser.userID];

就像没有意义一样,因为userID可能是唯一的,LIKE比简单等价贵得多。


如果您只想与一类实体建立一对多关系,则必须在Entity中添加另一个属性,例如NSNumber,表示它的类型。假设您使用enum来使数字类型更具可读性,那么谓词将如下所示:

[NSPredicate predicateWithFormat:
       @"ANY (entity.type == %@ && entity.userID == %@)",
       @(EntityTypeMention), _currentUser.userID];