首页 文章

带有NSPredicate的NSFetchedResultsController

提问于
浏览
0

我使用NSFetchedResultsController来处理进出UITableView的数据 . 一切正常,直到我把NSPredicate放在它上面 . 我需要获取与至少一条未过期或尚未设置expiration_date的消息有关系的所有Thread对象 . 所以我使用以下谓词 .

NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];

问题是这会导致NSFetchedResultsController行为非常奇怪 . 如果线程在其消息关系中获得新消息,则删除该行 . 它也不会插入新的 .

我100%肯定是导致这些行为的NSPredicate . 没有它,一切正常我只是没有一些我不想过滤掉的数据 .

下面是我的数据模型中谈到的部分的图片 . 我还将包含NSFetchedResultsController的代码 .

/**
 * Returns a NSFetchedResultsController for the unified inbox
 *
 * @return Controller for fetched results
 */
- (NSFetchedResultsController *)resultsControllerForUnifiedInbox
{
    NSFetchRequest      *threadsRequest = [NSFetchRequest fetchRequestWithEntityName:@"Thread"];
    NSEntityDescription *threadModel    = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:_mainManagedObjectContext];

    [threadsRequest setEntity:threadModel];

    NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];

    [threadsRequest setPredicate:threadPredicate];

    NSSortDescriptor *threadSort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];

    [threadsRequest setSortDescriptors:[NSArray arrayWithObject:threadSort]];
    [threadsRequest setFetchBatchSize:LiftFetchControllerAtrributeBatchSize];

    NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:threadsRequest
                                                                                               managedObjectContext:_mainManagedObjectContext
                                                                                                 sectionNameKeyPath:nil
                                                                                                          cacheName:nil];

    return fetchedResultsController;
}

enter image description here

1 回答

  • 2

    我无法解释你观察到的谓词的奇怪效果,但我认为你的谓词并没有达到预期的效果 .

    [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];
    

    查找所有未设置expiration_date消息的线程或者具有可能不同的消息 . 你(可能)需要的是

    [NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.expiration_date == null OR $m.expiration_date > %@).@count > 0", [NSDate date]];
    

相关问题