вставить и изменить запись в объекте с использованием Core Data - PullRequest
0 голосов
/ 09 апреля 2010

Я пытался найти ответ на свой вопрос в интернете, но не смог. У меня есть простая сущность в данных Core, которая имеет атрибут Value (то есть целое число) и атрибут Date. Я хочу определить два метода в моем файле .m.

Первый метод - метод ДОБАВИТЬ. Он принимает два аргумента: целочисленное значение (введенное пользователем в пользовательском интерфейсе) и дату (текущая дата по умолчанию). и затем вставьте запись в сущность на основе аргументов.

Второй метод похож на метод приращения. Он использует дату в качестве ключа для поиска записи и затем увеличивает целочисленное значение этой записи.

Я не знаю, как написать эти методы. (предположим, что у нас есть Array Controller для таблицы в xib-файле)

1 Ответ

7 голосов
/ 09 апреля 2010

Второй метод, который вы ищете, не подходит для добавления к самой сущности. Он должен находиться где-то выше сущностей, скорее всего, в вашем объекте контроллера.

Первый метод выглядит следующим образом:

- (void)updateDate:(NSDate*)date andValue:(NSInteger)value
{
  [self setValue:date forKey:@"date"];
  [self setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}

Это довольно прямая KVC (Key-Value Coding), и я настоятельно рекомендую вам прочитать документы Apple по этому вопросу.

Для вашего другого метода, который должен быть в контроллере, вам нужно выполнить выборку, чтобы найти запись.

- (id)findRecordForDate:(NSDate*)date inManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc]];
  [request setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];

  NSError *error = nil;
  NSArray *objects = [moc executeFetchRequest:request error:&error];
  NSAssert1(error == nil, @"Error fetching object: %@", [error localizedDescription]);

  return [objects lastObject];
}

- (void)incrementEntityWithDate:(NSDate*)date
{
  id entity = [self findRecordForDate:date inManagedObjectContext:[self managedObjectContext]];
  NSInteger value = [[entity valueForKey:@"value"] integerValue];
  value += 1;
  [entity setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}

Это также очень простой доступ к базовым данным. Я рекомендую вам прочитать о том, как работает Core Data.

Кстати, использование уникальной даты - очень плохой дизайн.

UPDATE

Маркус, спасибо за ответ. Это действительно полезно. Я новичок в основных данных, поэтому у меня есть несколько вопросов, чтобы прояснить ситуацию.

Код для первого метода устанавливает два значения, но он не вставляет новую запись в таблицу. Как я могу вставить вновь созданную запись в таблицу?

Вам нужно прочитать о том, как работает Core Data. У Apple есть отличная документация о том, как работает Core Data, и если это не поможет, вы можете купить мою книгу. В интернете содержится масса информации о том, как использовать базовые данные.

Куда мне поставить первый метод? в моем .m файле?

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

Вы упомянули, что мне нужно добавить второй метод в контроллер. Но контроллер определен в файле xib. Как я могу добавить второй метод к этому?

Контроллер никогда не определяется в xib-файле. На него есть ссылка в файле xib. Опять же, вам нужно вернуться к началу работы Objective-C и изучить основы, прежде чем погрузиться в это глубокое погружение.

...