首页 文章

NSFetchedResultsController与NSPredicate不更新

提问于
浏览
2

我从核心数据库中获取数据并将其显示在 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 回答

  • 4

    甚至比将缓存设置为 nil 更好的是给它一个唯一的名称 . 发布此问题之后iPhone - Cache name for NSFetchedResultsController我添加了一个函数来生成UUID作为我的缓存名称 .

  • 2

    您正在使用缓存(@“Root”)...尝试将其设置为nil,这可以防止崩溃 . 您不应该缓存意味着谓词的FetchedResultsControllers .

相关问题