Подтвердить что ты не робот

Программно обновить атрибут в основных данных

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

В 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
}

Ответ 3

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

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

Ответ Evan DiBiase показывает один правильный способ установки свойства - в частности, сообщения о доступе. Здесь синтаксис точки:

bookTwo.title = @"BarBar";

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

[bookTwo setValue:@"BarBar" forKey:@"title"];

Ответ 4

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

Ответ 5

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();
        }

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