iOS CoreData NSPredicate一次查询多个属性

我想使用UISearchBar查询NSManagedObject多个属性我有一个名为PersonNSManagedObject ,每个人都有一个namesocialSecurity属性。 现在我的代码可以对这些属性或其他属性执行search(提取),但不能同时执行这两个属性。

 - (void) performFetch { [NSFetchedResultsController deleteCacheWithName:@"Master"]; // Init a fetch request NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MainObject" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; // Apply an ascending sort for the color items //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Term" ascending:YES selector:nil]; NSSortDescriptor *sortDescriptor; sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"fullName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; NSArray *descriptors = [NSArray arrayWithObject:sortDescriptor]; [fetchRequest setSortDescriptors:descriptors]; // Recover query NSString *query = self.searchDisplayController.searchBar.text; //if (query && query.length) fetchRequest.predicate = [NSPredicate predicateWithFormat:@"Term contains[cd] %@", query]; if(searchValue==1) { if (query && query.length) fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query]; } else { if (query && query.length) fetchRequest.predicate = [NSPredicate predicateWithFormat:@"socialSecurity contains[cd] %@", query]; } // Init the fetched results controller NSError *error; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"pLLetter" cacheName:nil]; self.fetchedResultsController.delegate = self; if (![[self fetchedResultsController] performFetch:&error]) NSLog(@"Error: %@", [error localizedDescription]); [self.tableView reloadData]; } 

我不知道如何把这两个属性声明…

 if (query && query.length) fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query]; 

任何帮助或想法将不胜感激。

您可以使用通常的布尔操作数(如AND / OR)在NSPredicate追加多个search项。

这样的事情应该做的伎俩。

 [NSPredicate predicateWithFormat:@"name contains[cd] %@ OR ssid contains[cd] %@", query, query]; 

希望帮助:)

你可以使用NSCompoundPredicate

喜欢这个:

 NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query]; NSPredicate *predicateSSID = [NSPredicate predicateWithFormat:@"socialSecurity contains[cd] %@", query]; NSArray *subPredicates = [NSArray arrayWithObjects:predicateName, predicateSSID, nil]; NSPredicate *orPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates]; request.predicate = orPredicate; 

AND也有一个NSCompoundPredicateandPredicateWithSubpredicates:

除了@ Matthias的回答,你也可以使用NSCompoundPredicate来处理你的AND操作。

Obj-C – 与

 NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"]; NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"]; NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2]]; 

斯威夫特 – 与

 let predicate1:NSPredicate = NSPredicate(format: "X == 1") let predicate2:NSPredicate = NSPredicate(format: "Y == 2") let predicate:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2] ) 

Swift 3 – 与

  let predicate1 = NSPredicate(format: "X == 1") let predicate2 = NSPredicate(format: "Y == 2") let predicateCompound = NSCompoundPredicate(type: .and, subpredicates: [predicate1,predicate2]) 

为了避免警告不兼容的指针types使用types为“NSPredicate *”的expression式初始化“NSCompoundPredicate * _strong” ,请replace以下内容:

 NSCompoundPredicate * predicate = [NSCompoundPredicate orPredicateWithSubPredicates:subPredicates]; 

有了这个:

 NSPredicate * predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates]; 

来源: NSCompoundPredicate

Swift2完整的解决scheme

 let request = NSFetchRequest(entityName: "Location") let subPredicate1 = NSPredicate(format: "(name = %@)", searchString) let subPredicate2 = NSPredicate(format: "(street = %@)", searchString) let subPredicate3 = NSPredicate(format: "(city = %@)", searchString) request.predicate = NSCompoundPredicate(type: .OrPredicateType, subpredicates: [subPredicate1, subPredicate2, subPredicate3]) 

Fraser Hess在CISMGF.com上有一个很好的search范例。 你可以阅读这篇文章http://www.cimgf.com/2008/11/25/adding-itunes-style-search-to-your-core-data-application/

我的代码基于这个职位是:

 NSArray *searchTerms = [searchText componentsSeparatedByString:@" "]; if ([searchTerms count] == 1) { // Search in name and description NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name contains[cd] %@) OR (desc contains[cd] %@)", searchText, searchText]; [self.searchFetchedResultsController.fetchRequest setPredicate:predicate]; } else { // Search in name and description for multiple words NSMutableArray *subPredicates = [[NSMutableArray alloc] init]; for (NSString *term in searchTerms) { NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name contains[cd] %@) OR (desc contains[cd] %@)", term, term]; [subPredicates addObject:pred]; } NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; [self.searchFetchedResultsController.fetchRequest setPredicate:predicate]; } 

这可能是有用的,如果你想search多个属性的任何匹配(例如UISearchControllerDelegate):

 NSString *searchFor = @"foo"; NSArray *fields = @[@"Surname", @"FirstName", @"AKA", @"Nickname"]; // OR'd dictionary fields to search NSMutableArray *predicates = NSMutableArray.new; for (NSString *field in fields) { [predicates addObject:[NSPredicate predicateWithFormat:@"(%K BEGINSWITH[cd] %@)", field, searchFor]]; } NSPredicate *search = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; 

例如,您可以使用它来过滤字典数组:

 NSArray *results = [bigArray filteredArrayUsingPredicate:search]; 

(BEGINSWITH [cd]不是魔术,只是表示匹配string的开始和不区分大小写。根据您的匹配条件,根据需要进行更改。

对于Swift:

 var predicate = NSCompoundPredicate( type: .AndPredicateType, subpredicates: [predicate1, predicate2] )