私はモデルを持っています:
Place:
title
address
category <--->> Category:
title
また、カテゴリ名としてセクションを含むテーブル ビューが必要ですが、場所のタイトルに基づいて検索できるようにしたいと考えています。では、指定された searchText に一致するカテゴリとタイトルのみを持つテーブル ビューのデータ セットを取得する最善の方法は何でしょうか? 現在、結果を NSDictionary に入れていますが、あまり効率的ではないようです。特に削除タイプの操作を実行する場合、多くの問題に遭遇します。現在、私は次のことを行っていますが、むしろ直接 FetchedResultsController を返します。
+ (NSMutableDictionary *)getDictionaryResultsInContext: (NSManagedObjectContext *)context
forSearchText: (NSString *)searchText {
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Place"];
if(![searchText isEqualToString:@""] && searchText != nil){
req.predicate = [NSPredicate predicateWithFormat:@"(category.name CONTAINS[cd] %@) OR (placeTitle CONTAINS[cd] %@) OR (details CONTAINS[cd] %@)", searchText, searchText, searchText];
NSLog(@"ModelHelper.getResults: Search text given, creating predicate: %@", req.predicate);
}
req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"placeTitle"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]initWithFetchRequest:req
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
NSError *error = nil;
[controller performFetch:&error];
if (error) {
NSLog(@"- Model Search ERROR: %@ (%@)", [error localizedDescription], [error localizedFailureReason]);
}
NSLog(@"- Got results: %i", [controller.fetchedObjects count]);
NSMutableDictionary* ret = [[NSMutableDictionary alloc]init];
for(Place* obj in controller.fetchedObjects){
if(obj != nil){
NSManagedObjectID* categoryId = obj.category.objectID;
if(categoryId != nil){
NSMutableArray* ary = (NSMutableArray*)[ret objectForKey:categoryId];
if(ary == NULL){
ary = [[NSMutableArray alloc]init];
[ret setObject:ary forKey:categoryId];
}
[ary addObject:obj];
}
else {
// Shouldnt happen
NSLog(@"- Category was nil.");
}
}
else {
// Shouldnt happen
NSLog(@"- Place was nil.");
}
}
return(ret);
}