Программное обновление атрибута в Core Data

Я просмотрел всю документацию по классам для Core Data и не могу найти способ программного обновления значений в объекте основных данных. Например, у меня есть структура, подобная этой:

 id  | title
============
  1  | Foo  
  2  | Bar  
  3  | FooFoo

Скажем, я хочу обновить Bar до BarBar, я не могу найти способ сделать это ни в одной документации.


person macinjosh    schedule 10.01.2009    source источник


Ответы (5)


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

NSError *saveError;
[bookTwo setTitle:@"BarBar"];
if (![managedObjectContext save:&saveError]) {
    NSLog(@"Saving changes to book book two failed: %@", saveError);
} else {
    // The changes to bookTwo have been persisted.
}

(Примечание: bookTwo должен быть управляемым объектом, связанным с managedObjectContext, чтобы этот пример работал.)

person Evan DiBiase    schedule 10.01.2009

В Core Data объект — это объект, это объект, а база данных — это не то, на что вы бросаете команды.

Чтобы обновить что-то, что сохраняется, вы воссоздаете его как объект, обновляете и сохраняете.

NSError *error = nil;

//This is your NSManagedObject subclass
Books * aBook = nil;

//Set up to get the thing you want to update
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyLibrary" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"Title=%@",@"Bar"]];

//Ask for it
aBook = [[context executeFetchRequest:request error:&error] lastObject];
[request release];

if (error) {
//Handle any errors
}

if (!aBook) {
    //Nothing there to update
}

//Update the object
aBook.Title = @"BarBar";

//Save it
error = nil;
if (![context save:&error]) {
           //Handle any error with the saving of the context
}
person giff    schedule 13.07.2011
comment
Сохраняет ли Core Data автоматически? Вы можете вызвать save, если хотите принудительно, но он должен автоматически сохранить AFAIK. - person Joshua Dance; 02.05.2013
comment
Не совсем. Если вы разрешите XCode настроить проект Core Data в последних выпусках, код шаблона будет включать некоторые вызовы метода сохранения контекста управляемого объекта в местах последнего шанса, таких как applicationWillTerminate в делегате приложения, но это, вероятно, менее надежно, чем большинство приложения требуют. Призывы к сохранению дороги - пример здесь после очень незначительного изменения сделан для полноты картины. - person giff; 10.05.2013

Похоже, вы думаете о лежащей в основе реляционной базе данных. API Core Data построен на объектах моделей, а не на реляционных базах данных.

Сущность — это объект Cocoa — экземпляр класса NSManagedObject или его подкласса. Атрибуты сущности являются свойствами объекта. Вы используете кодирование ключ-значение или, если вы реализуете подкласс, точечный синтаксис или методы доступа для установки этих свойств.

Ответ Эвана ДиБиасе показывает один правильный способ установки свойства, в частности, сообщение доступа. Вот точечный синтаксис:

bookTwo.title = @"BarBar";

И KVC (который вы можете использовать со старым добрым NSManagedObject):

[bookTwo setValue:@"BarBar" forKey:@"title"];
person Peter Hosey    schedule 11.01.2009

Если я правильно понимаю ваш вопрос, я думаю, что все, что вам нужно иметь в виду, это управляемые объекты, которые на самом деле ничем не отличаются от любого другого класса Cocoa. Атрибуты имеют средства доступа и мутаторы, которые вы можете использовать в коде, посредством кодирования значения ключа или посредством привязок, только в этом случае они генерируются Core Data. Единственный трюк заключается в том, что вам нужно вручную объявить сгенерированные методы доступа в вашем файле класса (если он у вас есть) для вашей сущности, если вы хотите избежать использования setValue:ForKey:. В документации это описано более подробно, но краткий ответ заключается в том, что вы можете выбрать свои атрибуты в конструкторе модели данных и выбрать Копировать объявления метода Obj-C 2.0 в меню «Дизайн».

person Marc Charbonneau    schedule 11.01.2009

NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

        NSArray *temp = [[NSArray alloc]initWithObjects:@"NewWord", nil];


        [object setValue:[temp objectAtIndex:0] forKey:@"title"];



        // Save the context.
        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

Я думаю, что этот фрагмент кода даст вам идею;)

person NamshanNet    schedule 26.07.2013