如何获取核心数据中的一对多关系?

时间:2010-10-24 19:27:12

标签: objective-c core-data entity-relationship

假设数据实体为: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 个答案:

答案 0 :(得分: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。

相关问题