Вы знаете какой-либо способ удалить все записи, хранящиеся в Core Data? Моя схема должна оставаться неизменной; Я просто хочу, чтобы reset он был пустым.
Edit
Я хочу сделать это программно, чтобы пользователь мог существенно нажать кнопку reset
.
Вы знаете какой-либо способ удалить все записи, хранящиеся в Core Data? Моя схема должна оставаться неизменной; Я просто хочу, чтобы reset он был пустым.
Edit
Я хочу сделать это программно, чтобы пользователь мог существенно нажать кнопку reset
.
Вы все равно можете удалить файл программно, используя метод NSFileManager: removeItemAtPath::.
NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
Затем просто добавьте постоянное хранилище, чтобы убедиться, что оно воссоздано правильно.
Программный способ итерации через каждый объект как медленнее, так и подвержен ошибкам. Использовать это так, если вы хотите удалить некоторые объекты, а не другие. Однако вам все равно необходимо убедиться, что вы сохранили ссылочную целостность или вы не сможете сохранить свои изменения.
Простое удаление магазина и повторное создание его быстро и безопасно и, безусловно, могут быть сделаны программно во время выполнения.
Обновление для iOS5 +
С введением внешнего двоичного хранилища (допускаетExternalBinaryDataStorage или Store in External Record File) в iOS 5 и OS X 10.7 просто удалить файлы, на которые указывает storeURL, недостаточно. Вы оставите файлы внешней записи позади. Поскольку схема именования этих внешних файлов записи не является общедоступной, у меня пока нет универсального решения. - an0 8 мая 12 в 23:00
Вы можете удалить файл SQLite, но я решил сделать это, удалив таблицы по отдельности с помощью функций:
- (void) deleteAllObjects: (NSString *) entityDescription {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
for (NSManagedObject *managedObject in items) {
[_managedObjectContext deleteObject:managedObject];
DLog(@"%@ object deleted",entityDescription);
}
if (![_managedObjectContext save:&error]) {
DLog(@"Error deleting %@ - error:%@",entityDescription,error);
}
}
Причина, по которой я решил сделать это таблица за таблицей, заключается в том, что во время программирования я подтверждаю, что удаление содержимого таблицы является разумным, и нет данных, которые я бы предпочел хранить.
Делать это будет намного медленнее, чем просто удалить файл, и я перейду на удаление файла, если этот метод займет слишком много времени.
Используйте NSBatchDeleteRequest
чтобы удалить все объекты в сущности, не загружая их в память или не просматривая их.
// create the delete request for the specified entity
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = MyEntity.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
// get reference to the persistent container
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer
// perform the delete
do {
try persistentContainer.viewContext.execute(deleteRequest)
} catch let error as NSError {
print(error)
}
Этот код был обновлен для iOS 10 и Swift 3. Если вам нужна поддержка iOS 9, посмотрите этот вопрос.
Источники:
Я написал метод clearStores
, который проходит через каждое хранилище и удаляет его как из координатора, так и из файловой системы (обработка ошибок оставлена в стороне):
NSArray *stores = [persistentStoreCoordinator persistentStores];
for(NSPersistentStore *store in stores) {
[persistentStoreCoordinator removePersistentStore:store error:nil];
[[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}
[persistentStoreCoordinator release], persistentStoreCoordinator = nil;
Этот метод находится внутри класса coreDataHelper
, который заботится (помимо прочего) о создании persistentStore, когда он равен нулю.
Я удаляю все данные из основных данных на кнопку Event в классе HomeViewController: Эта статья помогла мне так сильно, что я решил, что внес свой вклад.
-(IBAction)buttonReset:(id)sender
{
NSLog(@"buttonReset Pressed");
//Erase the persistent store from coordinator and also file manager.
NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
NSError *error = nil;
NSURL *storeURL = store.URL;
[self.persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
NSLog(@"Data Reset");
//Make new persistent store for future saves (Taken From Above Answer)
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
}
Обратите внимание, что для вызова self.persistentStoreCoordinator я объявил свойство в Home View Controller. (Не беспокойтесь об управляемом объекте, который я использую для сохранения и загрузки.)
@property (nonatomic, retain) NSManagedObjectContext * managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator * persistentStoreCoordinator;
Затем в AppDelegate ApplicationDidFinishLaunching прямо под созданием HomeViewController у меня есть:
homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
homeViewController.persistentStoreCoordinator = self.persistentStoreCoordinator;
MagicalRecord делает это очень просто.
[MyCoreDataObject MR_truncateAll];
iOS9 +, Swift 2
Удалить все объекты во всех сущностях
func clearCoreDataStore() {
let entities = managedObjectModel.entities
for entity in entities {
let fetchRequest = NSFetchRequest(entityName: entity.name!)
let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try context.executeRequest(deleteReqest)
} catch {
print(error)
}
}
}
[Поздний ответ в ответ на щедрость, требующую новых ответов]
Оглядываясь на более ранние ответы,
Но существует другой, похожий подход к удалению постоянного хранилища, который работает. Ключ состоит в том, чтобы поместить ваш постоянный файл хранилища в свой собственный подкаталог, который не содержит ничего. Не просто вставляйте его в каталог документов (или где угодно), создайте новый подкаталог только для постоянного хранилища. Содержимое этого каталога будет являться постоянным файлом хранилища, файлами журнала и внешними двоичными файлами. Если вы хотите уничтожить все хранилище данных, удалите этот каталог, и все они исчезнут.
При настройке постоянного хранилища вы сделаете что-то вроде этого:
NSURL *storeDirectoryURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"persistent-store"];
if ([[NSFileManager defaultManager] createDirectoryAtURL:storeDirectoryURL
withIntermediateDirectories:NO
attributes:nil
error:nil]) {
NSURL *storeURL = [storeDirectoryURL URLByAppendingPathComponent:@"MyApp.sqlite"];
// continue with storeURL as usual...
}
Затем, когда вы хотите удалить хранилище,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Это рекурсивно удаляет как настраиваемый подкаталог, так и все файлы основных данных в нем.
Это работает, только если у вас нет постоянного хранилища в той же папке, что и другие важные данные. Как и каталог документов, в котором, вероятно, есть и другие полезные материалы. Если это ваша ситуация, вы можете получить тот же эффект, ища файлы, которые вы do хотите сохранить и удалить все остальное. Что-то вроде:
NSString *docsDirectoryPath = [[self applicationDocumentsDirectory] path];
NSArray *docsDirectoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDirectoryPath error:nil];
for (NSString *docsDirectoryItem in docsDirectoryContents) {
// Look at docsDirectoryItem. If it something you want to keep, do nothing.
// If it something you don't recognize, remove it.
}
Этот подход может быть подвержен ошибкам. Вы должны быть абсолютно уверены, что знаете каждый файл, который хотите сохранить, потому что в противном случае вы могли бы удалить важные данные. С другой стороны, вы можете удалить внешние двоичные файлы, не зная имя файла/каталога, используемого для их хранения.
Вот комбинированное решение для очистки Core Data.
- (void)deleteAllObjectsInCoreData
{
NSArray *allEntities = self.managedObjectModel.entities;
for (NSEntityDescription *entityDescription in allEntities)
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entityDescription];
fetchRequest.includesPropertyValues = NO;
fetchRequest.includesSubentities = NO;
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Error requesting items from Core Data: %@", [error localizedDescription]);
}
for (NSManagedObject *managedObject in items) {
[self.managedObjectContext deleteObject:managedObject];
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Error deleting %@ - error:%@", entityDescription, [error localizedDescription]);
}
}
}
Если вы хотите удалить все объекты и не хотите удалять файлы резервных копий, вы можете использовать следующие методы:
- (void)deleteAllObjectsInContext:(NSManagedObjectContext *)context
usingModel:(NSManagedObjectModel *)model
{
NSArray *entities = model.entities;
for (NSEntityDescription *entityDescription in entities) {
[self deleteAllObjectsWithEntityName:entityDescription.name
inContext:context];
}
}
- (void)deleteAllObjectsWithEntityName:(NSString *)entityName
inContext:(NSManagedObjectContext *)context
{
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:entityName];
fetchRequest.includesPropertyValues = NO;
fetchRequest.includesSubentities = NO;
NSError *error;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
NSLog(@"Deleted %@", entityName);
}
}
Остерегайтесь, что это может быть очень медленно (зависит от того, сколько объектов находится в вашем объектном графе).
Если вы хотите пройти маршрут удаления всех объектов (что намного проще, чем срывать стек Core Data, но менее результативен), чем это более эффективная реализация:
- (void)deleteAllManagedObjectsInModel:(NSManagedObjectModel *)managedObjectModel context:(NSManagedObjectContext *)managedObjectContext
{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[managedObjectContext performBlockAndWait:^{
for (NSEntityDescription *entity in managedObjectModel) {
NSFetchRequest *fetchRequest = [NSFetchRequest new];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesSubentities:NO];
NSArray *objects = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
for (NSManagedObject *managedObject in objects) {
[managedObjectContext deleteObject:managedObject];
}
}
[managedObjectContext save:nil];
}];
}];
[operation setCompletionBlock:^{
// Do stuff once the truncation is complete
}];
[operation start];
}
Эта реализация использует NSOperation
для выполнения удаления основного потока и уведомления по завершении. Вы можете захотеть издать уведомление или что-то в блоке завершения, чтобы вернуть статус в основной поток.
Решение iOS 10 + Swift 3:
func clearCoreDataStore() {
let delegate = UIApplication.shared.delegate as! AppDelegate
let context = delegate.persistentContainer.viewContext
for i in 0...delegate.persistentContainer.managedObjectModel.entities.count-1 {
let entity = delegate.persistentContainer.managedObjectModel.entities[i]
do {
let query = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
let deleterequest = NSBatchDeleteRequest(fetchRequest: query)
try context.execute(deleterequest)
try context.save()
} catch let error as NSError {
print("Error: \(error.localizedDescription)")
abort()
}
}
}
Итерирует все сущности данных ядра и очищает их
Вот несколько упрощенная версия с меньшим количеством вызовов AppDelegate и последней части кода, которая осталась без ответа. Также я получаю сообщение об ошибке "Постоянное хранилище объектов недоступно из этого координатора NSManagedObjectContext", поэтому просто нужно добавить это обратно.
NSPersistentStoreCoordinator *storeCoordinator = [self persistentStoreCoordinator];
NSPersistentStore *store = [[storeCoordinator persistentStores] lastObject];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dataModel"];
NSError *error;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
if (storeCoordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:storeCoordinator];
}
быстрое решение:
class func deleteAllManagedObjects() {
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "mom")
let mom = NSManagedObjectModel(contentsOfURL: modelURL)
for entityName in mom.entitiesByName.keys {
let fr = NSFetchRequest(entityName: entityName as String)
let a = Utility.managedObjectContext().executeFetchRequest(fr, error: nil) as [NSManagedObject]
for mo in a {
Utility.managedObjectContext().deleteObject(mo)
}
}
Utility.managedObjectContext().save(nil)
}
Как быстрая ссылка на сохранение поиска в другом месте - воссоздание постоянного хранилища после его удаления может быть выполнено с помощью
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
Спасибо за сообщение. Я последовал за ним, и это сработало для меня. Но у меня был другой вопрос, который не упоминался ни в одном из ответов. Поэтому я не уверен, что это был только я.
В любом случае, подумал, что я отправлю здесь проблему и способ, которым это удалось решить.
У меня было несколько записей в базе данных, я хотел очистить все до того, как записать новые данные в db, поэтому я сделал все, включая
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
а затем использовал managedObjectContext
для доступа к базе данных (предположительно до сих пор пустой), так или иначе данные все еще были там.
Через некоторое время выяснилось, что мне нужно reset managedObjectContext
, managedObject
, managedObjectModel
и
persistentStoreCoordinator
, прежде чем использовать managedObjectContext
для доступа к dabase. Теперь у меня есть чистая база данных для записи.
Несколько хороших ответов на этот вопрос. Здесь хороший лаконичный. Первые две строки удаляют базу данных sqlite. Затем цикл for: удаляет любые объекты в памяти managedObjectContext.
NSURL *storeURL = [[(FXYAppDelegate*)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppName.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) {
[self.managedObjectContext deleteObject:ct];
}
вы также можете найти все имена сущностей и удалить их по имени. Его более длинная версия, но работает хорошо, поэтому вам не нужно работать с хранилищем persistence
- (void)clearCoreData
{
NSError *error;
NSEntityDescription *des = [NSEntityDescription entityForName:@"Any_Entity_Name" inManagedObjectContext:_managedObjectContext];
NSManagedObjectModel *model = [des managedObjectModel];
NSArray *entityNames = [[model entities] valueForKey:@"name"];
for (NSString *entityName in entityNames){
NSFetchRequest *deleteAll = [NSFetchRequest fetchRequestWithEntityName:entityName];
NSArray *matches = [self.database.managedObjectContext executeFetchRequest:deleteAll error:&error];
}
if (matches.count > 0){
for (id obj in matches){
[_managedObjectContext deleteObject:obj];
}
[self.database.managedObjectContext save:&error];
}
}
для "Any_Entity_Name" просто укажите любое имя вашего сущностей, нам нужно только выяснить описание сущности, в котором находятся ваши объекты. ValueForKey @ "name" возвращает все имена сущностей. Наконец, не забудьте сохранить.
Правильный ответ с удалением URL-адреса NSFileManager является правильным, но, как указано в редакции iOS 5+, постоянное хранилище не представлено только одним файлом. Для SQLite хранить его *.sqlite, *.sqlite-shm и *.sqlite-wal... к счастью, так как iOS 7+ мы можем использовать метод
[NSPsistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: options: error:]
чтобы позаботиться об удалении, поэтому код должен выглядеть примерно так:
NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSString *storeName = ...;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:storeURL.path options:@{NSPersistentStoreUbiquitousContentNameKey: storeName} error:&error];
Работает со всеми версиями. Перенесите имя сущности и выполните итерацию, чтобы удалить все записи и сохранить контекст.
func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
var context = NSManagedObjectContext()
if #available(iOS 10.0, *) {
context = self.persistentContainer.viewContext
} else {
context = self.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)")
}
}
Здесь версия, которая удаляет каждую запись в каждой вашей таблице.
Swift 4
static func resetDatabase() {
do {
try dataStore.persistentStoreCoordinator.managedObjectModel.entities.forEach { (entity) in
if let name = entity.name {
let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: name)
let request = NSBatchDeleteRequest(fetchRequest: fetch)
try mainContext.execute(request)
}
}
try mainContext.save()
} catch {
print("error resenting the database: \(error.localizedDescription)")
}
}
Удалить постоянный файл хранилища и настроить новый постоянный координатор хранилища?
Удалите sqlite из файла fileURLPath и затем создайте.
Предполагая, что вы используете MagicalRecord
и имеете хранилище сохранения по умолчанию:
Мне не нравятся все решения, предполагающие, что определенные файлы существуют и/или требуют ввода имен или классов сущностей. Это Swift (2), безопасный способ удаления всех данных из всех объектов. После удаления он также воссоздает новый стек (я действительно не уверен, насколько эта часть необходима).
Это godo для ситуаций "выхода из системы", когда вы хотите удалить все, но иметь рабочее хранилище и moc для получения новых данных (после входа пользователя в систему...)
extension NSManagedObject {
class func dropAllData() {
MagicalRecord.saveWithBlock({ context in
for name in NSManagedObjectModel.MR_defaultManagedObjectModel().entitiesByName.keys {
do { try self.deleteAll(name, context: context) }
catch { print("⚠️ ✏️ Error when deleting \(name): \(error)") }
}
}) { done, err in
MagicalRecord.cleanUp()
MagicalRecord.setupCoreDataStackWithStoreNamed("myStoreName")
}
}
private class func deleteAll(name: String, context ctx: NSManagedObjectContext) throws {
let all = NSFetchRequest(entityName: name)
all.includesPropertyValues = false
let allObjs = try ctx.executeFetchRequest(all)
for obj in allObjs {
obj.MR_deleteEntityInContext(ctx)
}
}
}
Используйте этот
+(NSArray *)fetchDataFromEntity:(NSString *)entityName context:(NSManagedObjectContext *)context
{
NSFetchRequest * fetchRequest =[[NSFetchRequest alloc] init];
NSEntityDescription * CategoriesEntity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[fetchRequest setEntity:CategoriesEntity];
NSError * error;
NSInteger count = [context countForFetchRequest:fetchRequest error:&error];
if (count && count>0) {
NSArray * fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects && fetchedObjects.count>0) {
return fetchedObjects;
}else
return nil;
}
else
return nil;
}
+ (void)deleteObjectsOfArray:(NSMutableArray*)ary context:(NSManagedObjectContext *)context {
for (NSManagedObject * obj in ary) {
[context deleteObject:obj];
}
NSError *saveError = nil;
[context save:&saveError];
}
+ (void)deleteEntity:(NSString *)entityName context:(NSManagedObjectContext *)context {
NSArray *listArray = [self fetchDataFromEntity:entityName context:context];
[self deleteObjectsOfArray:[NSMutableArray arrayWithArray:listArray] context:context];
}
Я взял код Grouchal и ускорил его. Я использовал перечисление с параллельным режимом (NSEnumerationConcurrent
), он немного ускорился по сравнению с циклом (в моем приложении я добавил эту функцию для тестировщиков, чтобы они могли очищать данные и делать тестовые окна, а не удалять и устанавливать приложение)
- (void)resetObjects
{
[self deleteAllObjectsInEntity:@"Entity1"];
[self deleteAllObjectsInEntity:@"Entity2"];
[self deleteAllObjectsInEntity:@"Entity3"];
[self deleteAllObjectsInEntity:@"Entity4"];
}
-(void) deleteAllObjectsInEntity:(NSString*) entityName
{
MainDataContext *coreDataContext = [MainDataContext sharedInstance];
NSManagedObjectContext *currentContext = coreDataContext.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:currentContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [currentContext executeFetchRequest:fetchRequest error:&error];
[items enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSManagedObject * obj, NSUInteger idx, BOOL *stop) {
[currentContext deleteObject:obj];
}];
if (![currentContext save:&error]) {
NSLog(@"Error deleting %@ - error:%@",entityName,error);
}
}
здесь моя версия swift3 для удаления всех записей. "Пользователи" - это имя объекта
@IBAction func btnDelAll_touchupinside(_ sender: Any) {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedObjectContext = appDelegate.persistentContainer.viewContext
let fetchReq = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
let req = NSBatchDeleteRequest(fetchRequest: fetchReq)
do {
try managedObjectContext.execute(req)
} catch {
// Error Handling
}
}
iOS 10 и Swift 3
Предполагая, что ваше имя объекта "Фото", и что вы создаете класс CoreDataStack...
func clearData() {
do {
let context = CoreDataStack.sharedInstance.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Photo")
do {
let objects = try context.fetch(fetchRequest) as? [NSManagedObject]
_ = objects.map{$0.map{context.delete($0)}}
CoreDataStack.sharedInstance.saveContext()
} catch let error {
print("ERROR DELETING : \(error)")
}
}
}
Вот хороший учебник о том, как использовать CoreData и как использовать этот метод. https://medium.com/compileswift/parsing-json-response-and-save-it-in-coredata-step-by-step-fb58fc6ce16f#.1tu6kt8qb
Еще один метод (помимо запроса на удаление пакета), который я часто использую (в зависимости от требований приложения), - сброс постоянного хранилища. Реализация выглядит следующим образом для iOS 10+ и Swift (при условии, что у вас есть класс CoreDataManager):
let persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "<Data-Model-Name>")
container.loadPersistentStores(completionHandler: { (storeDescription, err) in
if let err = err {
fatalError("loading of store failed: \(err)")
}
})
return container
}()
func resetPersistentStore() {
if let persistentStore = persistentContainer.persistentStoreCoordinator.persistentStores.last {
let storeURL = persistentContainer.persistentStoreCoordinator.url(for: persistentStore)
do {
try persistentContainer.persistentStoreCoordinator.destroyPersistentStore(at: storeURL, ofType: NSSQLiteStoreType, options: nil)
} catch {
print("failed to destroy persistent store:", error.localizedDescription)
}
do {
try persistentContainer.persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: nil)
} catch {
print("failed to re-add persistent store:", error.localizedDescription)
}
}
}
Одним из преимуществ этого метода является то, что он более прост, особенно когда у вас есть множество записей данных для многочисленных объектов в ваших основных данных. В этом случае пакетный запрос на удаление будет интенсивно использовать память.
Решение Swift 5.1
public static func reset() {
let coordinator = _persistentContainer.persistentStoreCoordinator
for store in coordinator.persistentStores where store.url != nil {
try? coordinator.remove(store)
try? FileManager.default.removeItem(atPath: store.url!.path)
}
}