Я получаю данные из базовой базы данных и представляю их в 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
.Вот почему это не работает, поэтому я должен заставить self.managedObjectContext
иметь то же самое, что и мой importContext
как-то ...