Постоянное хранилище копий/резервных копий

Обычно, когда я резервировал основной файл данных для своего приложения, я просто скопировал файл.sqlite в другое место во время работы приложения. Но теперь, когда журналирование (wal) включено, это больше не работает. Я не вижу способа для NSPersistentStoreCordinator или NSManagedObjectContext для записи нового файла. Я предполагаю, что у меня есть 2 метода:

    • Закройте постоянное хранилище и снова запустите его с помощью @{@"journal_mode": @"DELETE"}, а затем скопируйте файл.sqlite.
  1. Добавьте еще один постоянный магазин и, возможно, скопируйте его из оригинального ps в новый?

Любые лучшие идеи? Спасибо.

1 ответ

Изменение режима журнала устраняет файлы журнала, поэтому это просто. Я не знаю, что буду доверять этому для вашего использования, though--, потому что нет никакой гарантии, что Core Data действительно сбросил все новые изменения в файл SQLite. Возможно, все в порядке, но могут быть некоторые изменения в памяти, которые Core Data еще не выписала. Это почти наверняка безопасно, но есть небольшая вероятность, что он будет работать некорректно.

Вариант 2 был бы более безопасным, хотя больше работы. Я бы создал второе постоянное хранилище, используя NSPersistentStoreCoordinator migratePersistentStore:toURL:options:withType:error: method (который в документах упоминается как полезный для операций "сохранить как"). Если вы укажете Core Data для создания копии, убедитесь, что все необходимое на самом деле скопировано. Просто не делайте этого в своем основном постоянном координаторе хранилища, потому что после миграции PSC отбрасывает ссылку на исходный объект хранилища (файл все еще существует, но он больше не используется этим PSC). Этапы

  1. Создайте новый NSPersistentStoreCoordinator и добавьте оригинальный файл хранилища.
  2. Используйте этот новый PSC для перехода на новый URL-адрес файла.
  3. Отбросьте все ссылки на этот новый PSC, не используйте его ни для чего другого.

licensed under cc by-sa 3.0 with attribution.