1

UITableViewを介して Core Data sqlite からデータを取得する でオブジェクトをフィルタリングしようとしていNSFetchedResultsControllerます。フィルタリングする前は問題なく動作していましたが、ボタンをタップして、プロパティ (a BOOL)の 1 つが であるオブジェクトのみを表示できるようにする必要がありますYES。と呼びましょうisFavourite

どこから始めればいいのか、少し混乱しています。私は述語の概念を理解しており、これを構築しました。これは機能するはずです:

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

ただし、その述語を に付ける方法については少し混乱していNSFetchedResultsControllerます。そのエンティティのすべてのオブジェクトを単に返す別のフェッチ要求を使用して、既に割り当てて初期化しました(そしてそれは完全に機能します)。すでに初期化されている場合、取得リクエストを変更できますか? もしそうなら、どうすればいいですか、どうすればクエリを再実行できますか。UITableViewその後、 withreloadDataまたは同様のものを手動で更新する必要がありますか。次に、このフィルターをオフにしてすべての結果を表示するように戻したい場合はどうすればよいでしょうか?

ここで多くの既存の質問を読みましたが、ほとんどが検索バーに関連しているようで、回答がより複雑になっています。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 つのデリゲート メソッドはどれも呼び出されません。

4

1 に答える 1

2

述語を に付けないNSFetchedResultsControllerでください -- に付けますNSFetchRequestsetPredicate:その名前が示すとおりのことを行うというメソッドがあります。

fetchRequest属性を更新して再度呼び出すことで、フェッチ要求を変更できますperformFetch:。また、fetchedResultsControllerivar を無効にして、上記のコードを柔軟にして、有用な述語を追加することもできます。次にfetchedResultsControllerメソッドが呼び出されると、現在の述語を使用して新しいインスタンスが作成されます。NSFetchedResultsControllerこれにより、すべてのコードが 1 つのメソッドに統合されます。おそらく、CPU 使用率がわずかに高くなりますが、メンテナンスもおそらく簡単です。

于 2013-02-25T17:19:17.820 に答える