2011-01-24 15 views
1

直到最近,我一直在爲我的項目使用Core Data和In-Memory存儲。現在我正在嘗試切換到SQLite存儲,並面臨以下問題:核心數據:包含多對多關係的NSPredicate在使用SQLITE存儲類型時不會產生任何結果

當試圖使用謂詞和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數組。

我讀過Apple的文檔,介紹了在SQLite商店中使用謂詞和sortDescritors時需要特別注意的問題。我在謂詞中使用單一(多) - 多對多關係(類別),所以這應該沒問題?

從提取中返回沒有錯誤。根本沒有對象(fetchedResultsController.fetchedObjects爲空)。

任何指導將不勝感激。

感謝

回答

0

我知道的SQLite店有"ANY"獲取在某些情況下(我不記得確切的)問題。也許嘗試修改您的搜索謂詞以查看您是否得到不同的結果,例如

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

我最終發現了這個問題。

我的查詢返回沒有結果,確實沒有結果。追溯到我創建對象的位置並用值填充真相時,我注意到我做錯了。我試圖做的:

[provider.categories addObject : newCategory]; 

哪一個沒有真正添加newCategory到類別關係。
具有意識到,核心數據用於對多關係自動生成存取後,我用下面的添加newCategory:

[provider addCategoriesObject : newCategory]; 

這正確地添加到newCategory的關係。

除此之外,我聲明瞭Provider.h中的addCategoriesObject來抑制編譯器警告。這爲我解決了這個問題。

唯一剩下的警告是編譯器沒有找到addCategoriesObject的實現:並警告「不完整的實現」。我還沒有想出一個辦法來壓制這個警告。