如何获取核心数据中的一对多关系?
问题描述:
假设数据实体是: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应该更新为书名中的用户类型而提高了读取性能。
答
这可能是个人喜好的问题,但我喜欢定义和使用获取请求模板。然后,你可以做这样的事情:
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。