Вопрос по objective-c – Как обновить существующий объект в Core Data?

56

Когда я вставляю новый объект, я делаю со следующим кодом:

<code>NSManagedObjectContext *context = [appDelegate managedObjectContext];

Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context];

favorits.title = @"Some title";

NSError *error;                    
if (![context save:&error]) {
    NSLog(@"Whoops");
}
</code>

Как я могу обновить существующий объект в основных данных?

Ваш Ответ

4   ответа
11

получать объект из контекста, измените свойства, которые вы хотите, затем сохраните контекст, как вы в своем примере.

хорошо, я получаю объект, что дальше? Пример пожалуйста. iWizard
@CroiOS Вы изменяете свойства точно так же, как изначально устанавливали их. Вы также сохраняете их точно так же.
0

если вы хотите удалить NSManagedObject

в моем случае ID является уникальным атрибутом для объекта STUDENT

/** for deleting items */

func Delete(identifier: String) {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT")
    let predicate = NSPredicate(format: "ID = '\(identifier)'")
    fetchRequest.predicate = predicate
    do
    {
        let object = try context.fetch(fetchRequest)
        if object.count == 1
        {
            let objectDelete = object.first as! NSManagedObject

                 context.delete(objectDelete)
        }
    }
    catch
    {
        print(error)
    }
} 

если вы хотите обновить NSManagedObject:

/** for updating items */
func Update(identifier: String,name:String) {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT")
    let predicate = NSPredicate(format: "ID = '\(identifier)'")
    fetchRequest.predicate = predicate
    do
    {
        let object = try context.fetch(fetchRequest)
        if object.count == 1
        {
            let objectUpdate = object.first as! NSManagedObject
            objectUpdate.setValue(name, forKey: "name")
            do{
                try context.save()
            }
            catch
            {
                print(error)
            }
        }
    }
    catch
    {
        print(error)
    }
}
127

Чтобы обновить конкретный объект, вам нужно настроитьNSFetchRequest, Этот класс эквивалентен утверждению SELECT на языке SQL.

Вот простой пример:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Favorits" inManagedObjectContext:moc]];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// error handling code

Массивresults содержит все управляемые объекты, содержащиеся в файле sqlite. Если вы хотите получить определенный объект (или несколько объектов), вам нужно использовать предикат с этим запросом. Например:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"];
[request setPredicate:predicate]; 

В этом случаеresults содержит объекты, где заголовок равенSome Title, Установка предиката равна помещению предложения WHERE в оператор SQL.

Для получения дополнительной информации я предлагаю вам прочитать руководство по программированию Core Data иNSFecthRequest ссылка на класс.

Core Data Programming Guide

NSFecthRequest Class Reference

Надеюсь, поможет.

EDIT (фрагмент, который можно использовать для обновления)

// maybe some check before, to be sure results is not empty
Favorits* favoritsGrabbed = [results objectAtIndex:0];    
favoritsGrabbed.title = @"My Title";

// save here the context

или если вы не используетеNSManagedObject подкласс.

// maybe some check before, to be sure results is not empty
NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
[favoritsGrabbed setValue:@"My title" forKey:@"title"];

// save here the context

В обоих случаях, если вы делаетеsave в контексте, данные будут обновлены.

@CroiOS Мой пример очень прост и не учитывает управление памятью.
@PavanMore Вам нужно создать запрос, изменить интересующее вас свойство и сохранить
@CroiOS Я добавил редактирование. Как я уже прокомментировал, код очень прост, и вам нужно сделать некоторую проверку перед этим. Это только руководство по изменению вашего управляемого объекта после извлечения. Постскриптум Проверьте код, потому что я написал от руки. Надеюсь, поможет.
спасибо & APOS; с. Можете ли вы обновить свой пост и добавить пример кода для обновления этого объекта, который я взял. Я здесь: Favorits * myObject = [array objectAtIndex: 0]; ... что дальше? iWizard
Спасибо, что указали, что я не должен иметь подклассNSManagedObject на все, чтобы сделать эту работу!
7

 NSMutableArray *results = [[NSMutableArray alloc]init];
int flag=0;
NSPredicate *pred;
if (self.txtCourseNo.text.length > 0) {
    pred =  [NSPredicate predicateWithFormat:@"courseno CONTAINS[cd] %@", self.txtCourseNo.text];
    flag=1;
} else {
    flag=0;
    NSLog(@"Enter Corect Course number");
}

if (flag == 1) {

    NSLog(@"predicate: %@",pred);
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"Course"];
    [fetchRequest setPredicate:pred];
    results = [[self.context executeFetchRequest:fetchRequest error:nil] mutableCopy];


    if (results.count > 0) {
        NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
        [favoritsGrabbed setValue:self.txtCourseName.text forKey:@"coursename"];
        [self.context save:nil];
        [self showData];
    } else {
        NSLog(@"Enter Corect Course number");
    }



}

Похожие вопросы