CoreData удаляет несколько объектов
Я знаю, как удалить один объект в CoreData. Мне просто интересно, есть ли более простой способ удаления нескольких объектов?
Для одиночного удаления вы можете использовать
[moc deleteObject:someManagedObject];
но нет эквивалента для нескольких объектов.
В настоящий момент я собираюсь сделать...
NSArray *arrayOfManagedObjectsToDelete = //...
for (SomeManagedObjectClass *managedObject in arrayOfManagedObjectsToDelete) {
[moc deleteObject:managedObject];
}
но я не был уверен, есть ли другой способ сделать это?
в идеале такой метод, как...
- (void)deleteObjects:(NSSet*)objects
on NSManagedObjectContext
или какой-либо подобный метод.
Ответы
Ответ 1
iOS10 и Swift 3
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityName")
let deleteRequest = NSBatchDeleteRequest( fetchRequest: fetchRequest)
do{
try mContext.execute(deleteRequest)
}catch let error as NSError {//handle error here }
Это удаляет все объекты EntityName
, но вы можете применить дополнительную фильтрацию с помощью NSPredicate
Ответ 2
iOS 9
Swift
let fetchRequest = NSFetchRequest(entityName: "EntityName") let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try myPersistentStoreCoordinator.executeRequest(deleteRequest, withContext: myContext) } catch let error as NSError {
// TODO: handle the error
}
Objective-C
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"EntityName"];
NSBatchDeleteRequest *deleteRq = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];
NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:deleteRq withContext:myContext error:&deleteError];
iOS 8 и старше
NSFetchRequest *fr = [[NSFetchRequest alloc] init];
[fr setEntity:[NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:myContext]];
[fr setIncludesPropertyValues:NO]; //only fetch the managedObjectID
NSError *error = nil;
NSArray *objects = [myContext executeFetchRequest:fr error:&error];
//error handling goes here
for (NSManagedObject *object in objects) {
[myContext deleteObject:object];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here
Ответ 3
Как я знаю, для этого нет метода... Вы должны делать то, что вы уже делаете. Существует метод deletedObjects
, но он просто возвращает набор объектов, которые будут удалены из их постоянного хранилища во время следующей операции сохранения, как описано в описании класса.
Ответ 4
Нет, нет конкретного метода удаления нескольких объектов atm. Но я бы сделал что-то подобное, похожее на то, что вы уже делаете:
- (void)removeFromManagedObjectContext {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"YourEntity" inManagedObjectContext:managedObjectContext];
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
for (Your Entity *Entity in results) {
[managedObjectContext deleteObject:Entity];
}
}