Удаление объекта с определенным заголовком из NSTreeController - PullRequest
0 голосов
/ 08 октября 2009

Мне интересно, как я могу удалить объект в зависимости от его заголовка для свойства CoreData 'name', которое у меня есть. Для добавления объекта я использую этот код:

NSManagedObjectContext *moc = [self managedObjectContext];
JGManagedObject *theParent = 
    [NSEntityDescription insertNewObjectForEntityForName:@"projects"
                                  inManagedObjectContext:moc];
[theParent setValue:nil forKey:@"parent"];
// This is where you add the title from the string array
[theParent setValue:@"myTitle" forKey:@"name"]; 
[theParent setValue:[NSNumber numberWithInt:0] forKey:@"position"];

Но я не могу найти эквивалентную функцию для удаления объекта.

1 Ответ

0 голосов
/ 09 октября 2009

Не знаю, смотрели ли вы в руководстве по программированию базовых данных в разделе добавление и удаление объектов.

Редактировать

Я изменил это, чтобы удалить из массива имен. Снова; Менее 5 минут работы с Руководство по программированию предикатов .

- (void)removeObjectsWithNames:(NSArray *)nameArray {
    // Get the moc and prepare a fetch request for the required entity
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    // Create a predicate for an array of names.
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN %@", nameArray];
    [request setPredicate:predicate];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    // Execute the fetch request put the results into array
    NSError *error = nil;
    NSArray *resultArray = [moc executeFetchRequest:request error:&error];
    if (resultArray == nil)
    {
        // Diagnostic error handling
        NSAlert *anAlert = [NSAlert alertWithError:error];
        [anAlert runModal];
    }

    // Enumerate through the array deleting each object.
    // WARNING, this will delete everything in the array, so you may want to put more checks in before doing this.
    For (JGManagedObject *objectToDelete in resultArray ) {
        // Delete the object.
        [moc deleteObject:objectToDelete];
    }
}

Отредактировано 10.10.2009 - Чтобы добавить то, что попробовал Иисус Навин.

for(NSString *title in oldTasks) { // 1
    // Get the moc and prepare a fetch request for the required entity
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"projects" inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    // Create a predicate for an array of names.
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title IN %d", oldTasks]; // 2
    [request setPredicate:predicate];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    // Execute the fetch request put the results into array
    NSError *error = nil;
    NSArray *resultArray = [moc executeFetchRequest:request error:&error];
    if (resultArray == nil)
    {
        // Diagnostic error handling
        NSAlert *anAlert = [NSAlert alertWithError:error];
        [anAlert runModal];
    }

    JGManagedObject *objectToDelete = [resultArray objectAtIndex:0];
    // Delete the object.
    [moc deleteObject:objectToDelete];
}

Примечания

Я выделил две строки.

  1. Вы вставили мой пример как цикл for, а не как вызов функции. Это просто снимает строки по одному и передает их в метод. В моем примере я передаю массив строк, которые вы хотите сопоставить.

  2. Вот где у вас возникла проблема. Если вы потрудились прочитать Руководство по программированию предикатов, расположенное справа вверху, в разделе «Основы предикатов», оно говорит, что ожидает, что класс, с которым он используется, должен быть совместимым с KVC. Вот почему вы получаете ошибку о соответствии KVC. Вы пытаетесь найти заголовок IN ... но заголовок не является свойством вашей модели.

Я думаю, вы можете быть смущены тем, что делает предикат. Посмотрите на пример кода, который я написал.

Во-первых, я создаю запрос Fetch, который будет выбирать объекты из сущности «Проекты».

Во-вторых, я создаю предикат, который говорит для каждого объекта, возвращаемого запросом выборки, получаю значение свойства 'name' и сравниваю его со значениями объектов в 'namesArray'

В-третьих, я создаю дескриптор сортировки, который будет сортировать результаты в порядке возрастания на основе свойства name.

Затем, как только я настроил этот запрос на выборку, я запускаю его для moc, и он возвращает массив объектов, соответствующих этим критериям.

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