如何使用NSPredicate搜索所有记录而不是将fetchController设置为nil?

5

我通过以下方法轻松地在UITableView中显示所有记录:

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Memo" inManagedObjectContext:[appDelegate managedObjectContext]];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"memodate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[appDelegate managedObjectContext] sectionNameKeyPath:nil
                                               cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;

return _fetchedResultsController;

而在搜索记录方面,我正在执行以下操作:

- (void)searchBar:(UISearchBar *)aSearchBar textDidChange:(NSString *)searchText {

if (self.searchBar.text ==nil || [self.searchBar.text isEqualToString:@""])
{
    self.fetchedResultsController=nil;
}
else
{
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"memodesc CONTAINS[cd] %@", self.searchBar.text];
    [_fetchedResultsController.fetchRequest setPredicate:predicate];

}

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    // Handle error
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();  // Fail
}

[self.tableView reloadData];}

我的问题是,如果searchText的值为nil"",搜索所有记录的正确方法是什么?

我正在设置self.fetchedResultsController=nil;以重新检索所有初始结果。

但我认为这不是正确的方法。应该可以用谓词来做到吗?

更新

使用以下谓词可以正常工作:

        NSPredicate *predicate =[NSPredicate predicateWithFormat:@"1=1"];
        [_fetchedResultsController.fetchRequest setPredicate:predicate];

但是如果我使用这个,我的应用程序会崩溃:

NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"];
[_fetchedResultsController.fetchRequest setPredicate:predicate];

Unable to parse the format string "ALL"'
3个回答

17

并且在 Swift 中:

let predicate = NSPredicate(value: true)

12

1
这个答案应该被用来提示,因为一些方法例如CKQuery initializers不能有nil的谓词。 - Justin Oroz
这个方法对我有效,而其他方法则没有。 - Adam B

7

如果您想获取所有实体,请将谓词设置为nil


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接