直到最近,我一直在为我的项目使用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为空)。
非常感谢任何指导。
谢谢
答案 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];