NSFetchedResultsController与NSPredicate不更新
我从Core Data-base获取数据并将它们呈现在UITableView
。 我使用NSFetchedResultController
来获取数据。 我希望用户能够在数据库中搜索,为此我使用NSPredicate
。
数据显示在UITableView
,一切正常,直到我将NSPredicate
设置为NSPredicate
。
我在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
有相同的东西…
您正在使用缓存(@“Root”)…尝试将其设置为nil,这可以防止崩溃。 您不应该缓存意味着谓词的FetchedResultsControllers。
甚至比将缓存设置为nil
更好的是给它一个唯一的名称。 在发布此问题后, iPhone – NSFetchedResultsController的缓存名称我添加了一个函数来生成UUID作为我的缓存名称。