Как получить отношения один ко многим в основных данных? - PullRequest
1 голос
/ 24 октября 2010

Допустим, объекты данных: Bookshop <--->> Books

Как мне получить все книги, принадлежащие определенному книжному магазину, например, с именем "cloud"? Следующий метод кажется неуклюжим.

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 Ответ

1 голос
/ 26 октября 2010

Это может быть вопросом личного вкуса, но мне нравится определять и использовать шаблоны запросов на выборку. Тогда вы можете сделать что-то вроде этого:

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.

...