如何使用 predicateWithFormat 查询 NSString 包含在 NSSet 中

Posted

技术标签:

【中文标题】如何使用 predicateWithFormat 查询 NSString 包含在 NSSet 中【英文标题】:How can I use predicateWithFormat for query a NSString is contained in an NSSet 【发布时间】:2013-02-22 14:38:03 【问题描述】:

使用 StackMob 作为后端。我有一个Event 实体,它的关系称为用户users(类型NSSet)。现在我想获取某个用户的username@"someuser" 的所有事件。我的代码是这样的:

[self.client getLoggedInUserOnSuccess:^(NSDictionary *result) 
        NSString *currentlyLoggedInUser = [result valueForKey:@"username"];

        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *eventEntity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedOjbectContext];
        [request setEntity:eventEntity];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY users.username = %@", currentlyLoggedInUser];
        NSLog(@"predicate: %@", predicate);
        [request setPredicate:predicate];
        NSLog(@"request: %@", request);
        events = [NSArray new];
        events = [self.managedOjbectContext executeFetchRequest:request error:nil];

        /* this is working...
        for (Event *e in events) 
            NSLog(@"%@",[e.users filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"username == %@", currentlyLoggedInUser]]);

        
         */
        NSLog(@"events: %@", events);
     onFailure:^(NSError *error) 

    ];

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您必须使用以下谓词:

NSString *userName = @"some user";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY users.username = %@", userName];

它会查找具有给定用户名的任何用户的所有事件。

【讨论】:

@yongho:为什么它不起作用?您是否收到错误消息或没有结果或错误结果? @yongho:我自己测试了它并且它有效。也许我没有正确理解您的问题。你能显示predicaterequest的NSLog()输出吗? 谓词:ANY users.username == "testuser" 请求:(实体:事件;谓词:(ANY users.username == "testuser");sortDescriptors: ((null )); 类型:NSManagedObjectResultType;) @yongho:奇怪,我再次测试了它,它对我有用。您可以尝试以下操作:从 fetch 请求中删除谓词并显示 NSLog(@"%@", [events valueForKeyPath:@"users.username"]); 的输出 "(\n test\n)", "(\n)", "(\n testuser\n)"【参考方案2】:

假设您有一个 User 实体和一个 Event 实体,您必须将一个 User 传递给谓词,而不仅仅是名称。

User *loggedInUser = // anything, e.g.
User *loggedInUser = [[allUsers filteredSetUsingPredicate:
                       [NSPredicate predicateWithFormat:
                         @"username == %@", currentlyLoggedInUser] anyObject];

fetchRequest.predicate = [NSPredicate predicateWithFormat:
                           @"%@ in users", loggedInUser]

【讨论】:

以上是关于如何使用 predicateWithFormat 查询 NSString 包含在 NSSet 中的主要内容,如果未能解决你的问题,请参考以下文章

用于电子邮件问题的 NSPredicate predicateWithFormat

NSPredicate predicateWithFormat 导致异常

predicateWithFormat 很慢

NSPredicate predicateWithFormat 从键中删除 $ 符号

NSPredicate - predicateWithFormat 不安全

NSPredicate predicateWithFormat "OR" 有问题