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

У меня есть сущность в моей основной модели данных, как это:

<code>@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;
</code>

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

<code>content = test
page_id = 5
book_id = 1331313
</code>

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

Ответы на вопрос(3)

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

 samir07 мая 2012 г., 17:34
спасибо за Ваш ответ
Решение Вопроса

КакиеMike Weller написал правильно. Я немного расширю ответ.

Сначала вам нужно создать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];

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

Just as a new object is not saved to the store until the context is saved, a deleted object is not removed from the store until the context is saved.

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

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();
}
 samir07 мая 2012 г., 15:17
Спасибо за Ваш ответ
 13 янв. 2015 г., 07:33
большое спасибо вам
 02 июл. 2015 г., 15:03
Стоит добавитьfetchRequest.includesPropertyValues = NO; в настройке, чтобы объекты поступали дешевле как неисправности.
 08 февр. 2014 г., 05:35
@flexaddicted Это должно быть отредактировано, чтобы включить[context save:&error] вызов, который должен иметь место, иначе удаленный объект не удалится из хранилища. Кроме того, если вы используете постоянное хранилище, оно должно быть сохранено следующим образом:[context saveToPersistentStore:&error].
 08 февр. 2014 г., 13:15
@EvanR Модифицировал мой ответ с учетом вашего комментария.

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

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

Как издокументация:

Just as a new object is not saved to the store until the context is saved, a deleted object is not removed from the store until the context is saved.

Это имело значение в моем случае.

 08 февр. 2014 г., 05:12
Это определенно необходимо. Я предложил это в качестве редактирования принятого ответа.

Ваш ответ на вопрос