私は最近まで自分のプロジェクトにインメモリストアのコアデータを使用していました。今度はSQLiteストアに切り替えようとしています。コアデータ:SQLiteストアタイプを使用すると、多対多関係を含むNSPredicateで結果が得られません
述語とsortDescriptorを使用してストアからオブジェクトをフェッチしようとすると、私のfetchedResultsControllerは0個のオブジェクトを返します。ストア型がメモリ内にある場合、まったく同じコードが正常に動作します。
これは私がフェッチ作っています方法です:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %K == %@", @"categories", category];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES selector:@selector(caseInsensitiveCompare:)];
self.fetchedResultsController = [self createFetchedResultsControllerWithEntityName : @"Provider" sectionName : @"group" sortDescriptor : sortDescriptor predicate : predicate cache : nil];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self.tableView reloadData];
と私はフェッチ要求作成ところ、これは次のとおりです。もう一度
- (NSFetchedResultsController *)createFetchedResultsControllerWithEntityName : (NSString*) entityName sectionName : (NSString*) sectionName sortDescriptor : (NSSortDescriptor*) sortDescriptor predicate : (NSPredicate*) predicate cache : (NSString*) cacheName{
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
//set predicate
if (predicate)
[fetchRequest setPredicate:predicate];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:sectionName
cacheName:cacheName];
aFetchedResultsController.delegate = self;
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return [aFetchedResultsController autorelease];
}
を、この非常に同じコードが多くをフェッチオブジェクトはメモリ内のストアを使用しますが、SQLiteを使用する場合は空のfetchedObjects配列です。
私は、SQLiteストアで述部とsortDescritorsを使用する際の特別な考慮事項に関して、Appleのドキュメントを読んでいます。私は述語で単一の(多対多)関係(カテゴリ)を使用しているので、これはうまくいくはずですか?
フェッチからエラーは返されません。単純にオブジェクトはありません(fetchedResultsController.fetchedObjectsは空です)。
ご指摘いただければ幸いです。
おかげ