1

我正在尝试过滤 a 中的对象UITableView,该对象通过 a 从 Core Data sqlite 获取其数据NSFetchedResultsController。它在过滤之前工作正常,但现在我需要能够点击一个按钮并让它只显示其属性(a BOOL)之一为的对象YES。让我们称之为isFavourite

我有点困惑从哪里开始。我理解谓词的概念,并且我已经构建了这个,它应该可以工作:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"isFavourite == 1"];

但是,对于如何将该谓词附加到NSFetchedResultsController. 我已经分配并初始化了它,使用一个单独的获取请求,它简单地返回了该实体的所有对象(并且效果很好)。如果它已经被初始化,我可以改变它的获取请求吗?如果是这样,我该怎么做,那么我该如何让它重新运行查询。然后我是否需要手动更新UITableViewwithreloadData或类似的。那么,当我想关闭此过滤器并返回查看所有结果时该怎么办?

我在这里阅读了很多现有问题,但大多数似乎与搜索栏有关,这使答案变得更加复杂。我还阅读了 Apple 文档,但倾向于发现它的编写方式非常神秘。我的代码在下面,我只是该filterFavourite方法的一部分,这就是我寻求帮助和澄清的地方。

- (NSFetchedResultsController *) fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName: @"Quote" inManagedObjectContext: [[CoreDataController sharedCoreDataController] managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"quoteID" ascending: YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    [fetchRequest setFetchBatchSize: 50];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: [[FQCoreDataController sharedCoreDataController] managedObjectContext] sectionNameKeyPath: nil cacheName: nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

- (IBAction) filterFavourite: (id) sender
{
    if (isDisplayingFavourite) {
        // Switch to showing all..
        NSPredicate *predicate = [NSPredicate predicateWithFormat: @"isFavourite == 1"];

        isDisplayingFavourite = NO;
    } else {
        // Switch to showing favourites only..

        isDisplayingFavourite = YES;
    }

}

controllerDidChangeContent编辑:此代码中从未调用委托方法“ ”。我也不知道为什么会这样。极其混乱,Core Data 就像一堵砖墙。事实上,四个委托方法中没有一个被调用过。

4

1 回答 1

2

您不将谓词附加到NSFetchedResultsController- 您将其附加到NSFetchRequest. 它有一个名为的方法setPredicate:,它的功能与它的名字所暗示的完全一样。

fetchRequest您可以通过更新属性并performFetch:再次调用来修改获取请求。您也可以将您的fetchedResultsControllerivar 设为 nil,并使上面的代码足够灵活,以添加任何有用的谓词。下次fetchedResultsController调用您的方法时,它将使用当前谓词为您创建一个新实例。这将您的所有NSFetchedResultsController代码整合到一种方法中。它的 CPU 使用率可能稍高一些,但也可能更容易维护。

于 2013-02-25T17:19:17.820 回答