NSFetchedResultsController с NSPredicate не обновляется - PullRequest
2 голосов
/ 21 декабря 2010

Я получаю данные из базовой базы данных и представляю их в 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 как-то ...

Ответы [ 2 ]

4 голосов
/ 28 декабря 2010

Вы используете кеш (@ "Root") ... Попробуйте установить его в ноль, это может предотвратить сбои.Вы не должны кэшировать FetchedResultsControllers, предназначенные для предиката.

2 голосов
/ 12 сентября 2011

Даже лучше, чем установить для кэша nil, дать ему уникальное имя. После размещения этого вопроса iPhone - имя кэша для NSFetchedResultsController Я добавил функцию для генерации UUID в качестве имен кеша.

...