Как сказать Xcode сбросить вывод CoreData в Sqlite - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю с CoreData в Xcode 10. Резервное хранилище данных для CoreData - Sqlite. Я работаю над приложением Swift, которое должно быть развернуто на iOS; не знаю, если это уместно.

Есть ли способ указать Xcode (или, я думаю, Simulator), после запуска приложения, сбросить любой вывод в файл Sqlite на диске? Вывод Sqlite, кажется, сбрасывается, только когда Xcode и / или Simulator закрыты, что немного неуклюже.

1 Ответ

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

Контекст управляемого объекта должен быть явно сохранен вскоре после изменения его данных. Это то, что вы должны делать в своем коде, а не функция Xcode или Simulator. Реализуйте и вызовите функцию, которая сохраняет соответствующий контекст управляемого объекта. Не ждите, пока ваше приложение завершится.

func save() {
    do {
        try self.managedObjectContext.save()
    }
    catch {
        let nserror = error as NSError
        NSLog("Whoops! \(nserror), \(nserror.userInfo)")
    }
}

Однако, если вы используете родительский и дочерний контексты, все немного сложнее. Документация Apple хорошо объясняет это:

Когда вы сохраняете изменения в контексте, изменения фиксируются только «на одно хранилище». Если вы сохраняете дочерний контекст, изменения переносятся в его родительский. Изменения не сохраняются в постоянном хранилище до тех пор, пока не будет сохранен корневой контекст. (Корневым контекстом управляемого объекта является тот, родительский контекст которого равен nil.) Кроме того, родительский объект не извлекает изменения у дочерних элементов до его сохранения. Вы должны сохранить дочерний контекст, если хотите в конечном итоге зафиксировать изменения.

Для хранилища SQLite постоянное хранилище , к которому они относятся, - это файлы SQLite на диске. (По умолчанию на диске есть три файла SQLite: основной файл, файл -shm и файл -wal).

...