Полностью сбросить CoreData - PullRequest
0 голосов
/ 28 ноября 2018

Я полностью на этом и у меня нет идей уже неделю.

У меня есть стек CoreData с несколькими координаторами и управляемыми контекстами, и я пытаюсь реализовать функцию logout в приложении.

Табличные представления, которые взаимодействуют с CoreData, находятся внутри TabBarController, и есть переходящие (т.е. регистрация и вход в систему) NavigationControllers и ViewController, которые ведут к нему.

То, что я пытаюсь реализовать, - это выход из системы (т. Е. Откат к начальному ViewController. До сих пор я пытался - безрезультатно:

  • сброс () каждого управляемогоObjectContext по отдельности
  • каждая возможная комбинация tableView.beginUpdates (), tableView.endUpdates (), tableView.reloadData (), frc.performFetch ()
  • Удалить каждую сущность в каждом управляемом объекте, а затем сбросить () каждый управляемый объект по отдельности
  • установить для tableView, fetchedResultsController делегатов и источника данных значение nil, а затем на self для viewDidLoad ()
  • Наличие NSNotification, которое срабатывает непосредственно перед выходом из системы - удаление всего в CoreData и его сохранение, эффективное обновление и очисткатаблица.
  • намного больше

Есть ли способ полностью сбросить CoreData, чтобы, когда пользователь откатывался к начальному ViewController и перезапускал весьпроцесс, который я не получу

Серьезная ошибка приложения. Исключительная ситуация при Core Daизменить обработку.Обычно это ошибка в наблюдателе NSManagedObjectContextObjectsDidChangeNotification.попытаться вставить строку 9 в раздел 0, но в разделе 0 после обновления с userInfo (null)

или в случае, если я очистил таблицу с помощью уведомлений, есть только 9 строк:

Серьезная ошибка приложения.Исключение было обнаружено во время обработки изменений Core Data.Обычно это ошибка в наблюдателе NSManagedObjectContextObjectsDidChangeNotification.попытка вставить строку 9 в раздел 0, но в разделе 0 после обновления только userInfo (null) * только 0 строк

CoreData работает просто отлично если я выйду из системы, закройте приложение и перезапустите.Нет ошибок таким образом.Это заставляет меня думать, что есть способ полностью сбросить CoreData (и любые связанные с ним tableViews, fetchedResultsControllers) или сбросить в первоначальное состояние при размотке на начальный ViewController.

или я должен просто дублировать раскадровку и иметь отдельный набор встроенных контроллеров viewController только для выхода из системы, чтобы CoreData не реинициализировался?

Есть идеи?Благодарю.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

попробуйте это!

  static let moduleName = "moduleName"

        //Model
        lazy var managedObjectModel:NSManagedObjectModel = {
            let modelURL = Bundle.main.url(forResource: moduleName, withExtension: "momd")!
            return NSManagedObjectModel(contentsOf: modelURL)!
        }()

     func deleteAllEntities() {
            let entities = 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 persistentStoreCoordinator.execute(deleteRequest, with: DataCoordinator.shared.managedObjectContext)
            debugPrint("Deleted Entitie - ", entityName)
        } catch let error as NSError {
            debugPrint("Delete ERROR \(entityName)")
            debugPrint(error)
        }
    }
0 голосов
/ 28 ноября 2018

В iOS9 и выше вы можете использовать destroyPersistentStore и по желанию добавить новый

func destroyAllData(storeType : String = NSSQLiteStoreType) throws {
    guard let storeURL = persistentStoreCoordinator.persistentStores.last?.url else {
        print("Missing store URL")
        return
    }
    try persistentStoreCoordinator.destroyPersistentStore(at: storeURL, ofType: storeType)
    // try persistentStoreCoordinator.addPersistentStore(ofType: storeType, configurationName: nil, at: storeURL)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...