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

Posted

技术标签:

【中文标题】我们如何使用 NSPredicate 搜索所有记录而不是设置 fetchController nil?【英文标题】:how we can search all records using NSPredicate rather than setting fetchController nil? 【发布时间】:2012-11-02 10:33:44 【问题描述】:

我可以通过以下方式轻松显示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"'

【问题讨论】:

【参考方案1】:

很快:

let predicate = NSPredicate(value: true)

【讨论】:

【参考方案2】:

我知道这是一个旧线程,但无论如何......你也可以使用:

[NSPredicate predicateWithFormat:@"TRUEPREDICATE"];

Predicate format syntax in Apple's documentation

【讨论】:

这个答案应该用于某些方法,例如 CKQuery 初始化器不能有 nil 谓词 这对我有用,而其他人没有。【参考方案3】:

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

【讨论】:

以上是关于我们如何使用 NSPredicate 搜索所有记录而不是设置 fetchController nil?的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 仅查找第一个匹配项

如何使用 NSPredicate 加快数组搜索速度?

如何使用正则表达式搜索忽略 NSPredicate 的某些字符?

使用 NSPredicate 和数组进行 cloudKit 搜索

如果搜索字符串包含左“(”和右“)”括号,NSPredicate 不起作用

如何在 NSPredicate 的帮助下使用自定义对象数组实现搜索?