核心数据实体搜索使用NSPredicate



我有一个应用程序,将数据保存到核心数据sql,然后在tableView中查看它。我正试图添加一个searchBar来搜索数据。

我创建了两个NSFetchedResultsController。一个用于获取实体数据,另一个用于使用NSPredicate过滤后获取实体数据。

- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }
    CoreDataStack *coreDataStack = [CoreDataStack DefaultStack];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"offer" inManagedObjectContext:coreDataStack.managedObjectContext];
    [fetchRequest setEntity:entity];
    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];
    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:@"sectionName" cacheName:nil];
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}
- (NSFetchedResultsController *)fetchedSearchResultsController{
    if (_fetchedSearchResultsController != nil) {
        return _fetchedSearchResultsController;
    }
    CoreDataStack *coreDataStack = [CoreDataStack DefaultStack];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"offer" inManagedObjectContext:coreDataStack.managedObjectContext];
    [fetchRequest setEntity:entity];
    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location contains[c] %@", self.searchDisplayController.searchBar.text];
    [fetchRequest setPredicate:predicate];
    _fetchedSearchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:@"sectionName" cacheName:nil];
    _fetchedSearchResultsController.delegate = self;
    return _fetchedSearchResultsController;
}

并通过cellForRowAtIndexPath显示每个单元格中的数据:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];//] forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Entry *entry = [self.fetchedResultsController objectAtIndexPath:indexPath];
    Entry *searchEntry = [self.fetchedSearchResultsController objectAtIndexPath:indexPath];
    NSString *recipe = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = searchEntry.location;
    } else {
        cell.textLabel.text = entry.location;
    }
    return cell;
}

但是我得到这个错误:*'NSRangeException',原因:'* -[__NSArrayM objectAtIndex:]:索引0超出空数组的界限'*

当我注释[fetchRequest setPredicate:predicate]; out时,我不再得到错误。所以我假设错误来自谓词,但我不知道如何克服它

Entry * Entry = [self。, fetchedResultsController objectAtIndexPath indexPath):;Entry *searchEntry = [self。fetchedSearchResultsController objectAtIndexPath indexPath):;首先检查条目和搜索条目是否返回null ?

最新更新