核心数据:使用SQLITE商店类型时,包含多对多关系的NSPredicate不会产生任何结果

时间:2011-01-24 16:18:41

标签: ios core-data many-to-many nspredicate

直到最近,我一直在为我的项目使用Core Data with In-Memory存储。现在我正在尝试切换到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关于在使用谓词和sortDescritors与SQLite商店时要特别考虑的文档。我在谓词中使用单个(多个)到多个关系(类别),所以这应该没问题?

fetch没有返回错误。根本没有对象(fetchedResultsController.fetchedObjects为空)。

非常感谢任何指导。

谢谢

2 个答案:

答案 0 :(得分:1)

我最终想出了这个问题。

我的查询返回没有结果确实没有结果。追溯到我创建对象的位置并使用值填充表达式我注意到我做错了。我试着这样做:

[provider.categories addObject : newCategory];

没有真正将newCategory添加到类别关系中 在意识到Core Data自动为多对关系生成访问器之后,我使用以下内容添加newCategory:

[provider addCategoriesObject : newCategory];

这正确地为关系添加了newCategory。

除此之外,我在Provider.h中声明了addCategoriesObject来抑制编译器警告。这解决了我的问题。

唯一剩下的警告是编译器没有找到addCategoriesObject的实现:并警告“不完整的实现”。我还没有找到一种方法来压制这个警告。

答案 1 :(得分:0)

我知道SQLite商店在某些情况下会遇到"ANY"次提取问题(我不记得确切的问题)。也许尝试修改您的搜索谓词,看看您是否得到不同的结果,例如

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