2016-10-07 2 views
20

Есть ли способ сделать пакетное удаление всех данных, хранящихся во всех сущностях в данных ядра?Удаление всех данных в объекте Core Data в Swift 3

Я где-то читал, что в iOS 9 или 10 яблоко представило способ делать пакетные удаления, но я не могу найти никакой хорошей информации об этом.

В конечном счете, мне просто нужна функция, которая проходит через сущность и удаляет все данные в ней. Похоже, он должен быть достаточно простым, но документация/учебники для него оказались чрезвычайно трудными для поиска.

Любые мысли?

Редактировать

Я добавил следующий код в IBAction, прикрепленного к кнопке:

@IBAction func clearAllData(_ sender: AnyObject) { 
    let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "PLProjects") 
    let request = NSBatchDeleteRequest(fetchRequest: fetch) 

    //get the data from core data 
    getPLData() 

    //reload the table view 
    tableView.reloadData() 
} 

Это не похоже на работу, однако. Если я закрою проект и снова его открою, данные все еще там. Я предполагаю, что это также почему представление таблицы не обновляется, потому что данные фактически не удаляются.

ответ

31

Вы думаете о NSBatchDeleteRequest, который был добавлен в прошивке 9. Создайте один, как это:

let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee") 
let request = NSBatchDeleteRequest(fetchRequest: fetch) 

Вы также можете добавить предикат, если вы только хотели удалить экземпляры, которые соответствуют предикату. Для выполнения запроса:

let result = try managedObjectContext.executeRequest(request) 

Обратите внимание, что пакетные запросы не обновляют текущее состояние приложения. Если вы управляли объектами в памяти, которые будут затронуты удалением, вы должны немедленно прекратить их использование.

+0

Я редактировал свой пост, чтобы показать код, который я использовал, - но это не похоже на работу для меня. В основном у меня есть UITableView, загруженный в мой контроллер представления, и я показываю все «проекты» в объекте под названием «PLProjects». У меня также есть экземпляр кнопки на экране с ассоциированным с ним IBAction. Обновления в моем комментарии показывают код в этом IBAction - который не удаляет элементы из Core Data Entity, а также не обновляет таблицу. –

+0

Недостаточно создать запрос. Вы должны выполнить его также. Запросы не запускаются автоматически, они запускаются, когда вы говорите им, чтобы они запускались. –

+0

А, простите об этом. Я неправильно понял, что вы изначально разместили. Я думал, что второй фрагмент кода должен был добавить предикат. Итак - с этим сказанным - во втором фрагменте есть, что такое «мок»? –

19

Для конкретизации ответа Тома, это то, что я добавил, чтобы иметь полную процедуру:

func deleteAllRecords() { 
    let delegate = UIApplication.shared.delegate as! AppDelegate 
    let context = delegate.persistentContainer.viewContext 

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

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

не следует использовать переменную делегата для объявления контекста? – MrAn3

Смежные вопросы