CoreData: проблема отображения отношений "один ко многим"
Я понимаю, что это довольно долго, но в настоящее время я работаю над своим первым проектом CoreData, и, несмотря на чтение каждого ресурса, я могу найти, что он еще не все тонет. до сих пор у меня есть все это, сохраняя и сохраняя все в порядке, однако я не могу заставить их работать правильно. У меня есть табличное представление, которое отображает категории Exersize, который перемещается в таблицу, отображающую связанные с ней размеры Exersize (один ко многим).
(попытался опубликовать изображение, но у меня пока недостаточно точек повторения), но модель данных выглядит так
Exersize Category<--- >> Exersize
Из всего, что я прочитал, я полагаю, что мне может понадобиться использовать предикат для фильтрации результатов, но я не совсем понимаю, как это на самом деле работает и выдерживает или нет, я на самом деле даже создаю и сохраняю Exersize Category и Exersizes объекты, соответствующие отношениям для работы в первую очередь.
Вот как я создаю и сохраняю (также устанавливая его имя для записи в текстовом поле)
ExersizeCategory *exersizeCategory = [NSEntityDescription insertNewObjectForEntityForName:@"ExersizeCategory"
inManagedObjectContext:self.managedObjectContext];
exersizeCategory.name = self.textField.text;
[self.managedObjectContext save:nil]; // write to database
А вот код для exersizes (в значительной степени идентичный)
// Create a new instance of the entity
exersize = [NSEntityDescription insertNewObjectForEntityForName:@"Exersize"
inManagedObjectContext:self.managedObjectContext];
exersize.name = self.textField.text;
[self.managedObjectContext save:nil]; // write to database
Хотя кажется, что это работает при создании объектов, и я вижу их на табличных представлениях, но мне еще предстоит реализовать coreDataGeneratedAccessors, как и где они вписываются в рисунок?
@interface ExersizeCategory (CoreDataGeneratedAccessors)
- (void) addExersizesObject: (Exersize *) значение;
- (void) removeExersizesObject: (Exersize *) значение;
- (void) addExersizes: (NSSet *) значения;
- (void) removeExersizes: (NSSet *) значения;
Я должен упомянуть, что я использую класс CoreDataTableViewController, который, кажется, уменьшает объем кода, который вам нужно написать для извлечения (который я нашел в руководстве, которое я просматривал на www.timroadly.com), созданном Стэнфордским университетом. примечание: было бы лучше не разбивать это на подклассы и просто использовать стандартный способ, как я заметил в.h, в нем говорится, что он защищен авторским правом для Стэнфорда, поэтому я не уверен, смогу ли я использовать его в приложении, которое хочу выпустить?
Вот как я в настоящее время выбираю для отображения Exersizes
- (void)setupFetchedResultsController {
// 1 - Decide what Entity you want
NSString *entityName = @"Exersize"; // Put your entity name here
NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);
// 2 - Request that Entity
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
// 3 - Filter it if you want
//currently unsure about this!
//request.predicate = [NSPredicate predicateWithFormat:@""];
// 4 - Sort it if you want
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
// 5 - Fetch it
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
[self performFetch];
}
Я знаю, что пропустил ключевые моменты в реализации этого, но я просто не уверен, что и где. Я работал с основными данными всего несколько дней, так что учиться было довольно здорово!
Спасибо всем, кто может пролить свет / ответить / или даже подтолкнуть меня в правильном направлении!
1 ответ
f.perdition,
Ты пишешь:
Хотя кажется, что это работает при создании объектов, и я вижу их на табличных представлениях, но мне еще предстоит реализовать coreDataGeneratedAccessors, как и где они вписываются в рисунок?
Базовые данные динамически создают реализации этих методов. Заголовки для вашего удобства и проверки типов соответствия.
Вот простой предикат, чтобы найти название упражнения на вашем exersize
юридическое лицо:
NSPredicate *p = [NSPredicate predicateWithFormat: @"%K == %@", @"name", @"Push Up"];
Эндрю
PS Возможно, вы захотите исправить свое написание слова упражнение.