Не знаю, смотрели ли вы в руководстве по программированию базовых данных в разделе добавление и удаление объектов.
Редактировать
Я изменил это, чтобы удалить из массива имен. Снова; Менее 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];
}
Примечания
Я выделил две строки.
Вы вставили мой пример как цикл for, а не как вызов функции. Это просто снимает строки по одному и передает их в метод. В моем примере я передаю массив строк, которые вы хотите сопоставить.
Вот где у вас возникла проблема. Если вы потрудились прочитать Руководство по программированию предикатов, расположенное справа вверху, в разделе «Основы предикатов», оно говорит, что ожидает, что класс, с которым он используется, должен быть совместимым с KVC. Вот почему вы получаете ошибку о соответствии KVC. Вы пытаетесь найти заголовок IN ... но заголовок не является свойством вашей модели.
Я думаю, вы можете быть смущены тем, что делает предикат. Посмотрите на пример кода, который я написал.
Во-первых, я создаю запрос Fetch, который будет выбирать объекты из сущности «Проекты».
Во-вторых, я создаю предикат, который говорит для каждого объекта, возвращаемого запросом выборки, получаю значение свойства 'name' и сравниваю его со значениями объектов в 'namesArray'
В-третьих, я создаю дескриптор сортировки, который будет сортировать результаты в порядке возрастания на основе свойства name.
Затем, как только я настроил этот запрос на выборку, я запускаю его для moc, и он возвращает массив объектов, соответствующих этим критериям.