我从核心数据库中获取数据并将其显示在 UITableView
中 . 我使用 NSFetchedResultController
来获取数据 . 我希望用户能够在数据库中搜索,为此我使用 NSPredicate
.
数据显示在 UITableView
中,一切正常,直到我将 NSPredicate
设置为 NSFetchedResultController
.
我在 ViewDidLoad
方法中使用它:
self.fetchedResultsController = nil;
fetchedResultsController_ = nil;
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1);
}
当用户输入 UITextField
中的文本时,该文本将转到新的 NSPredicate
.
这是在搜索开始时完成的:
NSPredicate *pred = nil;
pred = [NSPredicate predicateWithFormat:@"(Designation BEGINSWITH '22')"];
[fetchedResultsController_.fetchRequest setPredicate:pred];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1);
}
[tView reloadData];
现在我只使用 @"(Designation BEGINSWITH '22')"
进行测试 .
这是我的NSFetchedResultsController:
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController_ != nil) {
return fetchedResultsController_;
}
/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:importContext];//self.managedObjectContext
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Designation" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// 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:importContext sectionNameKeyPath:nil cacheName:@"Root"]; //self.managedObjectContext
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return fetchedResultsController_;
}
问题是所获取的数据保持不变,无论我是如何设置谓词 . 如果我在 viewDidLoad
中设置一个谓词就可以了,但是我再也不会尝试了 . 我使用“ importContext
”批量导入我的CoreData .
有任何想法吗?
提前致谢!
更新:好的,这是我发现的 . 我有 importContext
在哪里进行批量导入 . 而对于 fetchController
我使用 self.managedObjectContext
. 那's why it doesn'工作,所以我必须让 self.managedObjectContext
和我的 importContext
有某些东西......
2 回答
甚至比将缓存设置为
nil
更好的是给它一个唯一的名称 . 发布此问题之后iPhone - Cache name for NSFetchedResultsController我添加了一个函数来生成UUID作为我的缓存名称 .您正在使用缓存(@“Root”)...尝试将其设置为nil,这可以防止崩溃 . 您不应该缓存意味着谓词的FetchedResultsControllers .