Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2011年04月16日

NSFetchedResultsControllerでNSPredicateを指定するときはキャッシュをクリアすること



CoreDataをNSFetchedResultsControllerを使い、NSPredicateを使ってキーを指定して読み込む場合、キャッシュをクリアしないと、正しく読み込めない。

Core Dataを使い、TableViewオブジェクトを生成した場合、そのままのコードでは全件が抽出対象となる。

※Core Dataを使ったデータの取り扱い
http://iphone-app-developer.seesaa.net/article/137474933.html

このコードにNSPredicateによりキーを指定して条件抽出した場合でも、全件が抽出されてしまう。

これを回避して、キーを指定したデータのみ抽出されるようにするためには、キャッシュをクリアする必要がある。
具体的には、NSPredicateを設定して、NSFetchedResultsControllerでデータを読み出す前に、deleteCacheWithNameでキャッシュをクリアする。

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

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

[fetchRequest setFetchBatchSize:0]; // 0は無制限

NSMutableString *predicateCommand = [[NSMutableString alloc] initWithString: @"hogeItem = '"]; // キーを設定
[predicateCommand appendString: hogehoge];
[predicateCommand appendString: @"'"];

NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateCommand];
[fetchRequest setPredicate: predicate];

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

[NSFetchedResultsController deleteCacheWithName:@"Root"]; // キャッシュをクリア

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; // データの読み出し
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
[predicateCommand release];


return fetchedResultsController;

}


参考記事:
http://d.hatena.ne.jp/watanata2000/20101214/1292316099
http://cocoadays.blogspot.com/2010/07/uisearchdisplaycontroller_15.html
http://stackoverflow.com/questions/2193738/how-to-use-nsfetchedresultscontroller-and-uisearchdisplaycontroller




タグ:iPhone
posted by mobileDeveloper at 12:12 | Comment(0) | TrackBack(0) | Core Data はてなブックマーク - NSFetchedResultsControllerでNSPredicateを指定するときはキャッシュをクリアすること | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。