Я использую базовые данные для локального сохранения результатов от вызова веб-служб. Веб-сервис возвращает полную объектную модель, скажем, для «Автомобилей» - их может быть около 2000 (и я не могу заставить Веб-сервис возвращать что-либо меньше, чем 1 или ВСЕ автомобили).
В следующий раз, когда я открою свое приложение, я хочу обновить постоянную копию Базовых данных, снова вызвав веб-службу для всех автомобилей, однако для предотвращения дублирования мне нужно будет сначала удалить все данные в локальном кэше.
Существует ли более быстрый способ очистки ВСЕХ экземпляров определенного объекта в контексте управляемого объекта (например, всех объектов типа «CAR»), или мне нужно запросить их вызов, затем выполнить итерацию результатов, чтобы удалить каждый из них, а затем сохранить?
В идеале я мог бы просто сказать, удалить все, где сущность Бла.
источник
Ответы:
iOS 9 и более поздние версии:
В iOS 9 добавлен новый класс под названием,
NSBatchDeleteRequest
который позволяет легко удалять объекты, соответствующие предикату, без необходимости загружать их все в память. Вот как бы вы использовали это:Swift 5
Objective-C
Дополнительную информацию об удалении пакетов можно найти в сеансе «Что нового в основных данных» из WWDC 2015 (начиная с ~ 14: 10).
iOS 8 и более ранние версии:
Получить их все и удалить их все:
источник
Сбросить сущность в Swift 3 :
источник
Немного более чистый и универсальный: добавьте этот метод:
источник
Для Swift 2.0:
источник
Swift:
источник
Этот вопрос аналогичен приведенному здесь, и кто-то предложил настроить правило удаления отношений, поэтому вам нужно удалить только один объект. Поэтому, если у вас есть или вы можете создать сущность, имеющую отношение ко многим автомобилям, и установить правило удаления каскадно при удалении более высокой сущности, все машины также будут удалены. Это может сэкономить некоторое время на обработку, поскольку вам не нужно выполнять шаги, связанные с загрузкой ВСЕХ автомобилей. В большом наборе данных это может быть абсолютно необходимо.
источник
Хороший ответ уже выложен, это только рекомендация!
Хорошим способом было бы просто добавить категорию
NSManagedObject
и реализовать метод, как я сделал:Заголовочный файл (например
NSManagedObject+Ext.h
)Файл кода: (например, NSManagedObject + Ext.m)
... единственное, что вам нужно, это получить managedObjectContext от делегата приложения или от того, где он у вас есть;)
после этого вы можете использовать его как:
Еще одна оптимизация может заключаться в том, что вы удаляете параметр для имени сущности и вместо этого получаете имя из имени clazz. это привело бы к использованию:
более чистый impl (как категория для NSManagedObjectContext):
Использование тогда:
источник
[AppDelegate managedObjectContext]
это не обязательно "чистая архитектура" .. ;-)deleteAllFromEntity: inManagedObjectContext:
Обновление Swift 4, iOS 12 и Xcode 10
100% работает просто вырезать и вставить
Просто поместите эту функцию в соответствующий класс и вызовите эту функцию
self.deleteData()
вviewDidLoad()
любом месте или под функцией или кнопкой, чтобы при нажатии кнопки все данные из сущности были удалены, и замените «myEntity» как вашу сущность, которую вы определили в вашем основные данныеисточник
Swift 3.X и Swift 4.X , Простой способ. Изменить только YourTable
источник
iOS 10 и позже
Работает со всеми версиями. Передайте имя сущности и выполните итерацию, чтобы удалить все записи и сохранить контекст.
источник
CoreDataStack()
илиDataController()
уроки. Обновление будет оценено;)Расширяя ответ Дэйва Делонга.
Версия Swift, которая заботится о iOS 9 и предыдущих версиях. Я также рассмотрел обработку ошибок в этом:
пусть appDelegate: AppDelegate = UIApplication.sharedApplication (). делегировать как! AppDelegate
источник
Почему бы не сложить данные, которые вы получаете с существующим кэшем? В противном случае это не «обновление», это «запуск заново», и вы также можете удалить / удалить файл SQLLite и начать заново (при условии, что вы не сохраняете и другие данные).
источник
Swift 4, iOS 10+
Статическая функция, которая может применяться к любому объекту для удаления всех его данных
«Комната» - это сущность
Отредактировано в 20191025: инструкция «Self.fetchRequest ()» может вызвать проблему, если мы используем несколько целей в одних и тех же проектах. Так что заменено NSFetchRequest (entityName: String (описывающий: self))
источник
если сущность содержит много записей, то лучше всего так, потому что это экономит память
источник
В Swift 3.0
источник
Этот код будет работать для iOS 9 и ниже
источник
iOS 9.0 и новее:
NSBatchDeleteRequest
используется для удаления записей в основных данных. Это работает очень быстро и занимает меньше времени, чтобы удалить все записи из сущности. Это требуетNSFetchRequest
аргументации. Если вы хотите удалить все записи из объекта, вы можете использовать его, и это работает для меня.источник
быстрая очистка всех объектов в БД:
источник
Ответ Дейва Делонга на Swift 2.0 для меня не удался (в iOS 9)
Но это сработало:
источник
Решение Swift 3 с iOS 9 'NSBatchDeleteRequest' и откат к более ранним версиям iOS, реализованным как расширение для NSManagedObjectContext. Ссылка Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
источник
Используйте NSBatchDeleteRequest для удаления нескольких записей, если минимальный iOS 9.0. Если фоновый поток, выполнить NSManagedObjectContext сохранить, иначе используйте NSFetchRequest, чтобы получить записи и удалить все записи в течение цикла и Сохранить после удаления.
источник
в iOS 11.3 и Swift 4.1
Вы должны вызвать сброс после выполнения. Если нет, он не будет обновляться в представлении таблицы.
источник
источник
способ ООП без каких-либо строк в качестве имен сущностей Swift 3+, Xcode 10+
тогда просто позвоните в do / catch блок
источник
В Swift 2.0:
источник