假设数据实体为: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应该更新为用户在书名中的类型。
答案 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。