Основні дані: найшвидший спосіб видалити всі екземпляри сутності


383

Я використовую основні дані для локального збереження результатів виклику веб-служб. Веб-сервіс повертає повну об'єктну модель для, скажімо, "Автомобілів" - може бути близько 2000 з них (і я не можу змусити Веб-службу повернути нічого менше, ніж 1 або ВСІ автомобілі.

Наступного разу, коли я відкриваю свою програму, я хочу оновити копію збережених Core Data, зателефонувавши до Веб-сервісу для всіх Автомобілів, однак для запобігання копій потрібно спочатку очистити всі дані в локальному кеші.

Чи є більш швидкий спосіб очистити ВСІ екземпляри конкретного об'єкта в контексті керованого об'єкта (наприклад, усі об'єкти типу "CAR"), чи потрібно запитувати їх викликом, потім повторити результати, щоб видалити кожен, а потім зберегти?

В ідеалі я міг би просто сказати видалити все, де сутністю є Блах.


Ви можете використати базу даних пам'яті
J. Doe

Відповіді:


718

iOS 9 та новіших версій:

iOS 9 додав новий клас, який називається, NSBatchDeleteRequestщо дозволяє легко видаляти об'єкти, що відповідають предикату, не завантажуючи їх у пам'ять. Ось як би ви його використовували:

Швидкий 5

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
    try myPersistentStoreCoordinator.execute(deleteRequest, with: myContext)
} catch let error as NSError {
    // TODO: handle the error
}

Ціль-С

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];

NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:delete withContext:myContext error:&deleteError];

Більше інформації про пакетні видалення можна знайти в сесії "Що нового в основних даних" від WWDC 2015 (починаючи з ~ 14: 10).

iOS 8 і новіші версії:

Вилучити їх усіх та видалити їх усіх:

NSFetchRequest *allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Car" inManagedObjectContext:myContext]];
[allCars setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSError *error = nil;
NSArray *cars = [myContext executeFetchRequest:allCars error:&error];
[allCars release];
//error handling goes here
for (NSManagedObject *car in cars) {
  [myContext deleteObject:car];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here

74
Я також налаштував би вибір лише для отримання NSManagedObjectID, щоб зменшити будь-які накладні витрати від завантаження в повній структурі об'єкта.
Маркус С. Зарра

38
Не очевидно, як отримати лише NSMangagedObjectID .. використовувати [allCars setIncludesPropertyValues: NO]; (і не переймайтеся полюванням навколо того, як зробити NSPropertyDescription для ідентифікатора об’єкта!)
ohhorob

6
вибачте за запитання новачка: чи потрібно зберігати контекст після закінчення циклу for? наприклад [збереження myContext];
Стів

6
Будь-який новий інструмент в Основних даних, щоб зробити це більш ефективним? Це серйозна проблема для мого додатка, вже далеко в дорозі, що переносить основні дані. Для видалення всіх 4000 записів із однієї з декількох таблиць потрібно кілька секунд. Це занадто довго, щоб користувач чекав. Той самий запит безпосередньо з sqlite здається миттєвим.
Девід

4
@DaveDeLong Як ​​NSBatchDeleteRequest може викликати делегат NSFetchedResultsController? Я намагаюся майже все, але нічого не відбувається.
Foriger

36

Скинути об'єкт у Swift 3 :

func resetAllRecords(in entity : String) // entity = Your_Entity_Name
    {

        let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
        do
        {
            try context.execute(deleteRequest)
            try context.save()
        }
        catch
        {
            print ("There was an error")
        }
    }

32

Трохи більш очищений та універсальний: Додайте цей метод:

- (void)deleteAllEntities:(NSString *)nameEntity
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:nameEntity];
    [fetchRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID

    NSError *error;
    NSArray *fetchedObjects = [theContext executeFetchRequest:fetchRequest error:&error];
    for (NSManagedObject *object in fetchedObjects)
    {
        [theContext deleteObject:object];
    }

    error = nil;
    [theContext save:&error];
}

16

Для Swift 2.0:

class func clearCoreData(entity:String) {
  let fetchRequest = NSFetchRequest()
  fetchRequest.entity = NSEntityDescription.entityForName(entity, inManagedObjectContext: moc!)
  fetchRequest.includesPropertyValues = false
  do {
    if let results = try moc!.executeFetchRequest(fetchRequest) as? [NSManagedObject] {
      for result in results {
        moc!.deleteObject(result)
      }

      try moc!.save()
    }
  } catch {
    LOG.debug("failed to clear core data")
  }
}

12

Швидкий:

let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: context)
fetchRequest.includesPropertyValues = false

var error:NSError?
if let results = context.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject] {
    for result in results {
        context.deleteObject(result)
    }

    var error:NSError?
    if context.save(&error) {
        // do something after save

    } else if let error = error {
        println(error.userInfo)
    }

} else if let error = error {
    println("error: \(error)")
}

1
Цю відповідь слід
доповнити новим режимом

10

Це питання, аналогічне тому, яке тут, і хтось запропонував встановити правило видалення відносин, тому вам потрібно буде видалити лише один об’єкт. Тож якщо у вас є або можете зробити організацію, яка має відношення до багатьох автомобілів, і встановіть правило видалення на каскад, коли ви видалите вищу сутність, всі автомобілі також будуть видалені. Це може заощадити деякий час на обробку, оскільки вам не доведеться виконувати кроки щодо завантаження ВСІХ автомобілів. Для більшого набору даних це може бути абсолютно необхідним.


1
Я щойно спробував це у своєму поточному проекті з близько 600 основних об'єктів даних. Коли я інкапсулював їх в інший об’єкт з каскадом, на видалення знадобилося близько 9,1 сек. Якщо я використовував метод, запропонований Дейвом, про видалення потрібно приблизно 8,7 сек. Не помітна для мене різниця.
Андрій Циммер

8

Хороша відповідь була вже розміщена, це лише рекомендація!

Хорошим способом було б просто додати категорію до NSManagedObjectта застосувати метод, як я:

Файл заголовка (наприклад NSManagedObject+Ext.h)

@interface NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString*) entityName;

@end

Файл коду: (наприклад, NSManagedObject + Ext.m)

@implementation NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString *)entityName {
    NSManagedObjectContext *managedObjectContext = [AppDelegate managedObjectContext];
    NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
    [allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]];
    [allRecords setIncludesPropertyValues:NO];
    NSError * error = nil;
    NSArray * result = [managedObjectContext executeFetchRequest:allRecords error:&error];
    for (NSManagedObject * profile in result) {
        [managedObjectContext deleteObject:profile];
    }
    NSError *saveError = nil;
    [managedObjectContext save:&saveError];
}

@end

... єдине, що вам потрібно зробити - це отримати ManagedObjectContext від делегата додатка або там, де кожен у вас є;)

згодом ви можете використовувати його так:

[NSManagedObject deleteAllFromEntity:@"EntityName"];

ще одна оптимізація може полягати в тому, що ви видалите параметр для імені сутності та отримаєте ім'я замість clazzname. це призведе до використання:

[ClazzName deleteAllFromEntity];

більш чистий impl (як категорія до NSManagedObjectContext):

@implementation NSManagedObjectContext (Logic)

- (void) deleteAllFromEntity:(NSString *)entityName {
    NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
    [allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:self]];
    [allRecords setIncludesPropertyValues:NO];
    NSError * error = nil;
    NSArray * result = [self executeFetchRequest:allRecords error:&error];
    for (NSManagedObject * profile in result) {
        [self deleteObject:profile];
    }
    NSError *saveError = nil;
    [self save:&saveError];
}

@end

Використання тоді:

[managedObjectContext deleteAllFromEntity:@"EntityName"];

1
Вибачте, але [AppDelegate managedObjectContext]це не обов'язково "чиста архітектура" .. ;-)
Даніель Рінсер

Гаразд, правда. Код, наведений вище, заснований на одному керованомуObjectContext. первинний;) У багатопотоковому коді я зазвичай
зливаю

1
@DanielRinser можнаdeleteAllFromEntity: inManagedObjectContext:
Мохамед Елькассас

Так. Краще було б змінити метод deleteAllFromEntity з методу класу на об’єктний метод. тоді ви можете викликати deleteAllFromEntity безпосередньо в екземплярі MOC.
Ерхард Дінобл

7

Swift 4, iOS 12 та оновлення Xcode 10

100% працює просто вирізати та вставити

Просто поставте цю функцію у відповідний клас та зателефонуйте до цієї функції self.deleteData()у viewDidLoad()будь-якому місці чи під функцією чи кнопкою, щоб натисканням кнопки всі дані з сутності було видалено та замінили "myEntity" як ваш об'єкт, який ви визначили у своєму основні дані

func deleteData() {
    let appDel:AppDelegate = (UIApplication.shared.delegate as! AppDelegate)
    let context:NSManagedObjectContext = appDel.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "myEntity")
    fetchRequest.returnsObjectsAsFaults = false         
    do {
        let results = try context.fetch(fetchRequest)
        for managedObject in results {
            if let managedObjectData: NSManagedObject = managedObject as? NSManagedObject {
                context.delete(managedObjectData)
            }
        }
    } catch let error as NSError {
        print("Deleted all my data in myEntity error : \(error) \(error.userInfo)")
    }
}

Дякую, але чому концепція NSBatchDeleteRequest os не працює? будь-яка ідея.
Суреш Дурішетті

@SureshDurishetti Ви імпортували CoreData у свій клас?
Xcodian Solangi

1
Так, додано CoreDate. Але не пощастило.
Суреш Дурішетті

4
Ви забули додати збереження виклику в контексті, додайте контекст.save () і ви готові йти
Parama Dharmika

Так, це вимагає збереження контексту, інакше змін не відбудеться
Сурендра Кумар,

5

Swift 3.X та Swift 4.X , Легкий шлях. Змініть лише YourTable

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourTable")
    fetchRequest.returnsObjectsAsFaults = false

    do
    {
        let results = try context.fetch(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            context.delete(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all my data in \(entity) error : \(error) \(error.userInfo)")
    }

Також ви можете використовувати цю конструкцію: let fetchRequest: NSFetchRequest <NSFetchRequestResult> = YourTable.fetchRequest ()
Даніїл Чуйко

5

iOS 10 та новіших версій

Працює з усіма версіями. Введіть ім'я сутності та повторіть, щоб видалити всі записи та зберегти контекст.

func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
        let context = NSManagedObjectContext()
        context = your managedObjectContext

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
        fetchRequest.entity = NSEntityDescription.entity(forEntityName: entityToFetch, in: context)
        fetchRequest.includesPropertyValues = false
         do {   
            let results = try context.fetch(fetchRequest) as! [NSManagedObject]
            for result in results {
                context.delete(result)
            }
            try context.save()
            completion(true)
        } catch {
            completion(false)
            print("fetch error -\(error.localizedDescription)")
        }
    }

2
Дякуємо, що опублікували свою відповідь. Це працює для мене. Але вам не слід просто копіювати та вставляти тут свій код. Для новонародженого незрозуміло, що є вашими CoreDataStack()або DataController()класами. Будемо вдячні за оновлення;)
Ніко С.

4

Подовження відповіді Дейва Делонг

Швидка версія, яка також опікується iOS 9 та попередніми версіями. Я також висвітлював обробку помилок у цьому:

нехай appDelegate: AppDelegate = UIApplication.sharedApplication (). делегувати як! AppDelegate

    let fetchRequest = NSFetchRequest(entityName: "Car")
    if #available(iOS 9.0, *) {
        let delete = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try appDelegate.persistentStoreCoordinator.executeRequest(delete, withContext: appDelegate.managedObjectContext)
        } catch let error as NSError {
            print("Error occured while deleting: \(error)")
        }
    } else {
        // Fallback on earlier versions
        let carRequest = NSFetchRequest()
        carRequest.entity = NSEntityDescription.entityForName("Cars", inManagedObjectContext: appDelegate.managedObjectContext)
        carRequest.includesPropertyValues = false

        do {
            let cars: NSArray = try appDelegate.managedObjectContext.executeFetchRequest(carRequest)

            for car in cars {
                appDelegate.managedObjectContext.delete(car)
            }

            try appDelegate.managedObjectContext.save()

        } catch let error as NSError {
            print("Error occured while fetching or saving: \(error)")
        }
    }

прихильний. ios 9 спосіб видалення записів справді є awsm.
Шобхакар Тіварі

2

Чому б не скласти дані, які ви отримуєте за допомогою наявного кешу? Інакше це насправді не "освіжає", воно "починається заново", і ви можете також скинути / видалити файл SQLLite і почати заново (якщо вважати, що ви також не зберігаєте інші дані).


1
Погане рішення. Якщо в базі даних Sqlite є інші таблиці, ми, очевидно, все це втратимо. Це більше хакер для конкретного рішення і не може бути розглянуто для більш великих випадків.
Deepak GM

2

Swift 4, iOS 10+
Статична функція, яка може застосувати будь-яку організацію для видалення всіх її даних

protocol NSManagedObjectHelper {
}
extension NSManagedObject: NSManagedObjectHelper {
}
extension NSManagedObjectHelper where Self: NSManagedObject {
    static func removeAllObjectsInContext(_ managedContext: NSManagedObjectContext) {
        let request: NSFetchRequest = NSFetchRequest(entityName: String(describing: self))
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)
        do {
            deleteRequest.resultType = .resultTypeObjectIDs//to clear objects from memory
            let result = try managedContext.execute(deleteRequest) as? NSBatchDeleteResult
            if let objectIDArray = result?.result as? [NSManagedObjectID] {
                let changes = [NSDeletedObjectsKey : objectIDArray]
                /*By calling mergeChangesFromRemoteContextSave, all of the NSManagedObjectContext instances that are referenced will be notified that the list of entities referenced with the NSManagedObjectID array have been deleted and that the objects in memory are stale. This causes the referenced NSManagedObjectContext instances to remove any objects in memory that are loaded which match the NSManagedObjectID instances in the array.*/
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [managedContext])
            }
            try managedContext.save()
        } catch let error {
            print(error)
        }
    }
}

"Кімната" - це сутність

Room.removeAllObjectsInContext(self.persistentContainer.viewContext)

Відредаговано 20191025: інструкція "Self.fetchRequest ()" може спричинити проблему, якщо ми використовуємо кілька цілей в одних і тих же проектах. Тож замінено на NSFetchRequest (objectName: String (описуючи: self))


1

якщо сутність містить багато записів, найкращий спосіб такий, тому що це економить пам'ять

 - (void)deleteAll:(NSManagedObjectContext *)managedObjectContext entityName:(NSString *)entityName
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [managedObjectContext setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setIncludesPropertyValues:NO];
    [fetchRequest setFetchLimit:100]; // you can change this number if you want
    NSError *error;
    NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    while ([items count] > 0) {
        @autoreleasepool {
            for (NSManagedObject *item in items) {
                [managedObjectContext deleteObject:item];
            }
            if (![managedObjectContext save:&error]) {
                NSLog(@"Error deleting %@ - error:%@",self.entityName, error);
            }
        }
        items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    }
}

1

У Swift 3.0

 func deleteAllRecords() {
        //delete all data
        let context = appDelegate.persistentContainer.viewContext

        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "YourClassName")
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

        do {
            try context.execute(deleteRequest)
            try context.save()
        } catch {
            print ("There was an error")
        }
    }

1

Цей код буде працювати як для iOS 9, так і нижче

class func deleteAllRecords(in entity : String) // entity = Your_Entity_Name
    {

        let context = CoreDataStack.getContext() // Note:- Replace your context here with CoreDataStack.getContext()
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        if #available(iOS 9, *)
        {
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
            do
            {
                try context.execute(deleteRequest)
                try context.save()
            }
            catch
            {
                print("There was an error:\(error)")
            }
        }
        else
        {
            do{
                let deleteRequest = try context.fetch(deleteFetch)
                for anItem in deleteRequest {
                    context.delete(anItem as! NSManagedObject)
                }
            }
            catch
            {
                print("There was an error:\(error)")
            }
        }
        CoreDataStack.saveContext() // Note:- Replace your savecontext here with CoreDataStack.saveContext()
    }

1

iOS 9.0 та новіших версій:

NSBatchDeleteRequestвикористовується для видалення записів у основних даних. Це працює дуже швидко і вимагає менше часу, щоб видалити всі записи з об'єкта. Це вимагає NSFetchRequestаргументації. Якщо ви хочете видалити всі записи з об'єкта, ви можете використовувати його, і він працює для мене.

let manageObject:NSManagedObjectContext = appDelegateObject.managedObjectContext

let fetchRequest = NSFetchRequest(entityName: EnityName”)

let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

let persistCor:NSPersistentStoreCoordinator = appDelegateObject.persistentObject
 do {
        try persistCor.executeRequest(deleteRequest, withContext: manageObject)
        try manageObject.save()
    } catch {
        print(error?.localizedDescription)
    }

1

швидка очистка всіх об'єктів у БД:

func purgeAllData() {
    let uniqueNames = persistentContainer.managedObjectModel.entities.compactMap({ $0.name })

    uniqueNames.forEach { (name) in
      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: name)
       let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
         do {
        try persistentContainer.viewContext.execute(batchDeleteRequest)
      } catch {
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
      }
   }
 }

0

Відповідь Дейва Делонгса на Swift 2.0 була для мене крах (в iOS 9)

Але це спрацювало:

let fetchRequest = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    do {
        try managedObjectContext.executeRequest(deleteRequest)
        try managedObjectContext.save()
    }
    catch let error as NSError {
       // Handle error
    }

0

Рішення Swift 3 з iOS 9 'NSBatchDeleteRequest' та резервна версія до попередніх версій iOS, реалізованих як розширення на 'NSManagedObjectContext'. Apple посилання https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html

extension NSManagedObjectContext {
    func batchDeleteEntities<T: NSManagedObject>(ofType type: T.Type) throws {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing: type.self))
        if #available(iOS 9.0, *) {
            let request = NSBatchDeleteRequest(fetchRequest: fetchRequest)
            let result = try execute(request) as? NSBatchDeleteResult
            if let objectIDArray = result?.result as? [NSManagedObjectID] {
                let changes = [NSDeletedObjectsKey: objectIDArray]
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
            }
        } else {
            fetchRequest.includesPropertyValues = false
            let results = try fetch(fetchRequest)
            if let actualResults = results as? [NSManagedObject], !actualResults.isEmpty {
                actualResults.forEach { delete($0) }
            }
        }
    }
}

0

Використовуйте NSBatchDeleteRequest для видалення декількох записів Якщо Мінімум iOS становить 9,0. Якщо фоновий потік, виконайте NSManagedObjectContext save else, використовуйте NSFetchRequest для отримання записів та видалення всіх записів у циклі та збереження одного разу, коли видалення зроблено.


0

в iOS 11.3 та Swift 4.1

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest )
        batchDeleteRequest.resultType = .resultTypeCount
        do {
            let batchDeleteResult = try dataController.viewContext.execute(batchDeleteRequest) as! NSBatchDeleteResult
            print("The batch delete request has deleted \(batchDeleteResult.result!) records.")
            dataController.viewContext.reset() // reset managed object context (need it for working)
        } catch {
            let updateError = error as NSError
            print("\(updateError), \(updateError.userInfo)")
        }

вам доведеться викликати скидання після виконання. Якщо ні, він не оновлюватиметься у поданні таблиці.


0
    func deleteAll(entityName: String) {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    deleteRequest.resultType = .resultTypeObjectIDs
    guard let context = self.container?.viewContext
        else { print("error in deleteAll")
            return }

    do {
        let result = try context.execute(deleteRequest) as? NSBatchDeleteResult
        let objectIDArray = result?.result as? [NSManagedObjectID]
        let changes: [AnyHashable : Any] = [NSDeletedObjectsKey : objectIDArray as Any]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
    } catch {
        print(error.localizedDescription)
    }
}

0

спосіб OOP без жодних рядків, як імена сутностей Swift 3+, Xcode 10+

func batchDelete<T>(in context: NSManagedObjectContext, fetchRequest: NSFetchRequest<T>) throws {
    guard let request = fetchRequest as? NSFetchRequest<NSFetchRequestResult> else {
        throw ErrorService.defaultError
    }
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: request)
    do {
        try context.execute(batchDeleteRequest)
    } catch {
        throw error
    }
}

тоді просто зателефонуйте в блок "do / catch"

    let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
    do {
        let data = try context.fetch(fetchRequest)
        if data.count > 0 {
            try self.batchDelete(in: context, fetchRequest: fetchRequest)
        }
    } catch {
        // throw error
    }

-1

У Swift 2.0:

func deleteAllData(entity: String)
{
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: entity)
    fetchRequest.returnsObjectsAsFaults = false

    do 
    {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            managedContext.deleteObject(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all data in \(entity) error : \(error) \(error.userInfo)")
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.