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 Возможно, вы захотите исправить свое написание слова упражнение.

Другие вопросы по тегам