Вопрос по ios, objective-c – Удалить объект в основных данных

10

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

<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   ответа
5

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

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

В дополнение к Майк Веллер и 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.

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

Это определенно необходимо. Я предложил это в качестве редактирования принятого ответа.

Похожие вопросы