2011-01-24 13 views
1

私は最近まで自分のプロジェクトにインメモリストアのコアデータを使用していました。今度は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は空です)。

ご指摘いただければ幸いです。

おかげ

答えて

0

私はSQLiteの店がいくつかのケースで"ANY"フェッチの問題を(私は正確なものを覚えていない)知っています。たとえば、検索結果が異なるかどうかを確認するために検索述語を変更してみてください。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categories LIKE %@", category]; 
1

私はこの問題を最終的に突き止めました。

私のクエリは結果を返しませんでしたが、実際には結果はありませんでした。これを私がオブジェクトを作成していたところに戻し、値をrealtionshipsに入れると、私はそれが間違っていることに気付きました。私はやろうとしました:

[provider.categories addObject : newCategory]; 

実際には、カテゴリ関係にnewCategoryが追加されませんでした。
は、コアデータは自動的に、多くの関係のためのアクセサを生成することを実現した後、私はnewCategoryを追加するには、次を使用:

[provider addCategoriesObject : newCategory]; 

これは、適切な関係にnewCategoryを追加しました。

さらに、コンパイラの警告を抑制するためにProvider.hにaddCategoriesObjectを宣言しました。これは私の問題を解決しました。

残っている唯一の警告は、コンパイラがaddCategoriesObject:の実装を見つけられず、 "不完全な実装"について警告することです。私もこの警告を抑制する方法を考え出していない。

関連する問題