Ответ 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();
}