2010-10-24 105 views
1

假设数据实体是:Bookshop <--->> Books如何获取核心数据中的一对多关系?

如何获取属于特定书店的名称中包含“云”的所有书籍,例如?以下方法感觉笨重。

Bookshop *bookshop = (Bookshop *) nsManagedObjectFromOwner; 
NSString *searchTerm = @"cloud"; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Books" 
          inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
       @"ANY bookshop.Name == '%@' && Name contain[cd] '%@'", 
       bookshop.Name, searchTerm]; 
[fetchRequest setPredicate: predicate]; 

我该如何改进这个代码来处理,如果有2个名称非常相似的书店?也可能是因为UITableView应该更新为书名中的用户类型而提高了读取性能。

回答

1

这可能是个人喜好的问题,但我喜欢定义和使用获取请求模板。然后,你可以做这样的事情:

Bookshop *bookshop = (Bookshop *) nsManagedObjectFromOwner; 
NSString *searchTerm = @"cloud"; 

NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys:bookshop.Name, @"BOOKSHOP_NAME", searchTerm, @"BOOK_NAME", nil]; 
// BOOKSHOP_NAME and BOOK_NAME are the name of the variables in your fetch request template 

NSFetchRequest *fetchRequest = [model fetchRequestFromTemplateWithName:@"YourFetchRequestTemplateName" substitutionVariables:substitutionDictionary]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Books" 
         inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

它不是更少的代码,但它不太笨重,因为所有的提取请求在一个地方被定义。或者,也许我误解了你的问题?

就问题的第二部分而言,我自己并没有真正使用过这个,但NSFetchedResultsControllerDelegate提供了自动保持结果表最新的方法。尝试-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:。显然它意味着使用NSFetchedResultsController。