核心数据:使用具有多对多关系的谓词

时间:2013-10-13 03:24:10

标签: core-data nsfetchrequest

实体“会议”中的多对多关系< --->> “用户”

我为“会议”制作了一个NSManagedSubclass,它有一个属性:

@property (nonatomic, retain) NSSet *users;

*用户中的对象保存得很好,我可以看到它们。但是当我尝试取出时,没有任何反应。我在Block内部设置了断点,看起来fetch Block永远不会到达断点。没有错误。应用程序仍在运行。

我有以下代码:

        NSString *userName = @"iphone";
        NSLog(@"Username %@", userName);

        NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Meeting"];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"users.username == %@", userName];
        NSLog(@"Predicate %@", predicate);
        [request setPredicate:predicate];

        [self.managedObjectContext executeFetchRequest:request onSuccess:^(NSArray *results)
         { // I have setup the breakpoint here 
             NSLog(@"results.count %i", results.count);

             if(results.count > 0)
             {
                 NSLog(@"object found");
             }
         }onFailure:^(NSError *error) {
                  NSLog(@"There was an error! %@", error);
         }];

日志:

2013-10-12 20:10:19.200 App[3128:c07] Username iphone
2013-10-12 20:10:19.200 App[3128:c07] Predicate users.username == "iphone"

我可以在Meetings中获取其他属性。即如果我用谓词替换谓词行

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"meetings_id == %@", meetings_id];

断点将停止代码,将显示“找到对象”。

同样,我可以在用户关系中看到“iphone”用户。我做错了什么?

1 个答案:

答案 0 :(得分:2)

对于多对多关系,您必须使用谓词修饰符,它指出了预期的行为。由于您正在搜索Meeting s,因此如果您希望users.username == %@用户拥有指定用户名MeetingALL只有ANY,那么CoreData无法从您的谓词NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY users.username == %@", userName] 中找到答案。 {1}}单个用户符合要求(请参阅此处了解深入documentation)。

尝试使用此更改,因为我认为这是您想要的:

{{1}}