Программно обновить атрибут в основных данных - PullRequest
19 голосов
/ 11 января 2009

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

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

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

Ответы [ 5 ]

43 голосов
/ 13 июля 2011

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

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

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
}
24 голосов
/ 11 января 2009

Документация 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, чтобы этот пример работал.)

8 голосов
/ 11 января 2009

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

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

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

bookTwo.title = @"BarBar";

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

[bookTwo setValue:@"BarBar" forKey:@"title"];
6 голосов
/ 11 января 2009

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

2 голосов
/ 26 июля 2013
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();
        }

Я думаю, этот кусок кода даст вам идею;)

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