Основные данные: как сбросить все настройки при загрузке с loadPersistentStores? - PullRequest
0 голосов
/ 27 декабря 2018

При использовании «новой» настройки iOS 10 Core Data с loadPersistentStores, как я могу сбросить / удалить все?Я хотел бы избежать использования имен сущностей, но хотел бы использовать что-то вроде destroyPersistentStore.

. Я установил свой стек следующим образом:

persistentContainer = NSPersistentContainer(name: "CoreData", managedObjectModel: mom)
let storeDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let url = storeDirectory.appendingPathComponent("CoreData.sqlite")
let description = NSPersistentStoreDescription(url: url)
description.shouldInferMappingModelAutomatically = true
description.shouldMigrateStoreAutomatically = true
persistentContainer.persistentStoreDescriptions = [description]

persistentContainer.loadPersistentStores(completionHandler: { (_, error) in
    guard let error = error as NSError? else { return }
    fatalError("Unresolved error: \(error), \(error.userInfo)")
})
persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
persistentContainer.viewContext.undoManager = nil
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true

Я нашел решения только с помощью, например, BatchDeleteRequests, гдеМне нужно знать все имена сущностей, но я хотел бы что-то более общее и сбросить все - мне нужен самый эффективный / самый безопасный способ, когда пользователь выходит из системы.

1 Ответ

0 голосов
/ 29 декабря 2018

Это предложение выполняет следующие шаги

  • Получить хранилище из persistentStoreCoordinator
  • Сохранить URL-адрес хранилища
  • Сбросить контекст управляемого объекта
  • Уничтожить магазин
  • Добавить новый магазин

Код предполагает стандартную реализацию API iOS 10+ NSPersistentContainer с persistentStoreCoordinator и managedObjectContextсвойства в AppDelegate и хранилище SQLite.

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let persistentStoreCoordinator = appDelegate.persistentContainer.persistentStoreCoordinator
let currentStore = persistentStoreCoordinator.persistentStores.last!
let currentStoreURL = currentStore.url!
appDelegate.managedObjectContext.reset()
do {
    try persistentStoreCoordinator.destroyPersistentStore(at: currentStoreURL, ofType: NSSQLiteStoreType)
    try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: currentStoreURL)
} catch {
    print(error)
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...