Как быстро удалить все данные из основных данных, когда persistentContainer отсутствует в методе делегата приложения - PullRequest
0 голосов
/ 30 мая 2020

Я новичок в Swift и хочу удалить все данные из основных данных. Я видел несколько примеров, но во всех из них persistentContainer находится в AppDelegate, а в моем случае persistentContainer отсутствует в AppDelegate. Он находится в другом классе, как показано ниже

class CoreDataStack: NSObject {

    static let sharedInstance = CoreDataStack()
    private override init() {}

    func applicationDocumentsDirectory() {
        if let url = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).last {
            print(url.absoluteString)
        }
    }
    lazy var persistentContainer: NSPersistentContainer = {

        let container = NSPersistentContainer(name: "Database")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {

                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
            print(storeDescription)

        })
        return container
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {

                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}

В методе AppDelegate я просто называю его

CoreDataStack.sharedInstance.applicationDocumentsDirectory()

func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        CoreDataStack.sharedInstance.saveContext()
    }

Я пробовал этот код, но он не работает для меня.

https://stackoverflow.com/questions/24658641/ios-delete-all-core-data-swift

Кто-нибудь может мне помочь!

1 Ответ

1 голос
/ 30 мая 2020

Одним из решений может быть использование NSBatchDeleteRequest для всех сущностей в persistentContainer. Вы можете добавить эти методы в свой CoreDataStack:

func deleteAllEntities() {
    let entities = persistentContainer.managedObjectModel.entities
    for entity in entities {
        delete(entityName: entity.name!)
    }
}

func delete(entityName: String) {
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    do {
        try persistentContainer.viewContext.execute(deleteRequest)
    } catch let error as NSError {
        debugPrint(error)
    }
}

Весь код можно найти здесь

...