我正在使用像bellow这样的CoreData模型:
国家< ---->>>城市(一对多关系)
作为节/行结构列入UITableView,即
===埃及===
开罗
亚历山大
卢克
Ras AlBar
。
。
===卡塔尔===
多哈
。
。
。
现在我有UISearchBar应该允许用户根据国家名称或城市名称
中输入的单词的存在来过滤TableView因此,如果用户插入'ar',则应显示以下内容:
===埃及===
Ras AlBar
===卡塔尔===
多哈
。
。
。
在CoreData中找不到任何最佳查询来实现我想要的目标。
答案 0 :(得分:2)
你应该使用NSFetchedResultsController
。您没有提及是否存在,但可以更轻松地将CoreData
显示到TableView
。
无论如何,NSFetchedResultsController
的抓取应该在城市上。不是国家。 (同样,你不会说它是哪个,但以防万一)。
所以你可以使用的谓词是......
NSPredicate *cityPredicate = [NSPredicate predicateWithFormat:@"name [cd]CONTAINS %@", text];
NSPredicate *countryPredicate = [NSPredicate predicateWithFormat:@"country.name [cd]CONTAINS %@", text];
NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubPredicates:@[cityPredicate, countryPredicate]];
然后,当您使用compoundPredicate
进行抓取时,您将获得所需内容。
如何设置NSFetchedResultsController
在 CountryTableViewController.m 文件
中1 - 创建属性...
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
2 - 从源代码中获取托管对象上下文...
self.managedObjectContext = [(AppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext];
3 - 添加此方法......
#pragma mark - fetched results controller
- (NSFetchedResultsController*)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"City"];
[request setFetchBatchSize:20];
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"country.name" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sd]];
NSFetchedResultsController *aController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"country.name" cacheName:nil];
aController.delegate = self;
self.fetchedResultsController = aController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
4 - 对于过滤表格的方法......
- (void)filterResultsWithText:(NSString*)text
{
NSPredicate *cityPredicate = [NSPredicate predicateWithFormat:@"name [cd]CONTAINS %@", text];
NSPredicate *countryPredicate = [NSPredicate predicateWithFormat:@"country.name [cd]CONTAINS %@", text];
NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubPredicates:@[cityPredicate, countryPredicate]];
[self.fetchedResultsController.fetchRequest setPredicate:compoundPredicate];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
// Handle error
//exit(-1);
}
[self.tableView reloadData];
}
5 - 显示数据
现在将设置您的数据,您不再需要任何阵列。
要显示它,你可以......
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [[self.fetchedResultsController sections] count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
return [sectionInfo numberOfObjects];
}
- (NSString*)tableView:(UITableView*)tableView titleForSection:(NSInteger*)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
return [sectionInfo title];
}
要在索引路径上获取国家/地区,您可以执行此操作...
Country *country = [self.fetchedResultsController objectAtIndexPath:indexPath];
这将返回该索引路径所在的国家/地区。
有一些设置但是一旦你完成它就会明白为什么它如此简单。