Удаление объекта в основных данных

У меня есть сущность в моей базовой модели данных, например:

@interface Selection : NSManagedObject

@property (nonatomic, retain) NSString * book_id;
@property (nonatomic, retain) NSString * contenu;
@property (nonatomic, retain) NSNumber * page_id;
@property (nonatomic, retain) NSNumber * nbrOfOccurences;
@property (nonatomic, retain) NSString * next;
@property (nonatomic, retain) NSString * previous;

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

content = test
page_id = 5
book_id = 1331313

Как я могу это сделать?

Ответ 1

Что пишет Майк Уэллер. Я немного расширю ответ.

Сначала вам нужно создать NSFetchRequest следующим образом:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];    
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Selection" inManagedObjectContext:context]];

Затем вам нужно установить предикат для этого запроса следующим образом:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"content == %@ AND page_id == %@ AND book_id == %@", contentVal, pageVal, bookVal]];

где

NSString* contentVal = @"test";
NSNumber* pageVal = [NSNumber numberWithInt:5];
NSString* bookVal = @"1331313";

Я использую %@, так как предполагаю, что вы используете объекты, а не скалярные значения.

Теперь вы выполняете выборку в контексте с предыдущим запросом:

NSError* error = nil;
NSArray* results = [context executeFetchRequest:fetchRequest error:&error];

results содержит все управляемые объекты, которые соответствуют этому предикату.

Наконец, вы можете захватить объекты и называть их удалением.

[context deleteObject:currentObj];

После этого вам нужно сохранить контекст в соответствии с документацией.

Так же, как новый объект не сохраняется в хранилище до тех пор, пока контекст не будет сохранен, удаленный объект не будет удален из хранилища, пока не будет сохранен контекст.

Следовательно

NSError* error = nil;
[context save:&error];

Обратите внимание, что метод save возвращает значение bool. Таким образом, вы можете использовать такой подход, как следующий, или показать предупреждение пользователю. Источник Ошибка сохранения NSManagedObjectContext.

NSError *error = nil;
if ([context save:&error] == NO) {
    NSAssert(NO, @"Save should not fail\n%@", [error localizedDescription]);
    abort();
}

Ответ 2

Вы должны выполнить запрос выборки с помощью NSPredicate с соответствующими условиями, а затем вызвать метод deleteObject: на NSManagedObjectContext с каждым объектом в наборе результатов.

Ответ 3

В дополнение к Mike Weller и flexaddicted, после вызова [context deleteObject:currentObj]; вам нужно save: контекст:

NSError *error = nil;
[context save:&error];

Как из documentation:

Так же, как новый объект не сохраняется в хранилище до тех пор, пока контекст не будет сохранен, удаленный объект не будет удален из хранилища, пока не будет сохранен контекст.

Это делало вопрос в моем случае.