Новый режим журналирования значения по умолчанию для Базовых Данных SQLite хранит в Индивидуалистах OS X и iOS 7
Q: Мое приложение копирует и восстанавливает Базовые Данные хранилище SQLite путем копирования файла хранилища. Это работает хорошо над iOS 6.x и Пума OS X, но перестало работать на iOS 7 и Индивидуалистах OS X после обновления к последнему SDK. Почему это?
A: Отказ происходит, потому что режим журналирования значения по умолчанию для Базовых Данных, которые хранит SQLite, был изменен на Write-Ahead Logging (WAL) в Индивидуалистах OS X и iOS 7. С режимом WAL Базовые Данные сохраняют основной файл хранилища нетронутым и добавляют транзакции к a -wal файл в том же расположении. После того, как Базовый контекст Данных сохраняется, -wal файл не удален, и данные в том файле не объединяются с файлом хранилища также. Поэтому просто создание копий файла хранилища, вероятно, вызовет потерю данных и несоответствие.
Если Вы создаете Базовый Стек данных из файла хранилища, сгенерированного путем копирования основного файла хранилища, но не соответствия -wal файл, Ваше приложение может перестать работать многими способами, включая:
Храните данные, противоречивые с существующим кэшем. Это происходит при использовании a
NSFetchedResultsControllerс механизмом кэширования на. Несоответствие может инициировать исключения какNSObjectInaccessibleException, или выходные сигналы жалуясь, что персистентный кэш не соответствует текущую конфигурацию.Отказ получить метаданные Базового Хранилища данных с помощью следующего метода
NSPersistentStoreCoordinatorкласс:+ (NSDictionary *)metadataForPersistentStoreOfType:(NSString *)storeType URL:(NSURL *)url error:(NSError **)errorВызов этого метода вызовет ошибку SQLite «неспособного открыть файл базы данных».
Чтобы безопасно скопировать и восстановить Базовые Данные хранилище SQLite, можно сделать следующее:
Используйте следующий метод
NSPersistentStoreCoordinatorкласс, а не файловая система APIs, чтобы скопировать и восстановить Базовое Хранилище данных:- (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)errorОбратите внимание на то, что это - опция, которую мы рекомендуем.
Изменитесь на режим журналирования отката при добавлении хранилища к персистентному координатору хранилища, если необходимо скопировать файл хранилища. Перечисление 1 является кодом, показывающим, как сделать это:
Режим журналирования отката Использования перечисления 1 при добавлении персистентного хранилища
NSDictionary *options = @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};if (! [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error]) {// error handling.
}
Для хранилища, загруженного режимом WAL, если и основной файл хранилища и соответствие
-walфайл существует, с помощью режима журналирования отката, чтобы добавить, что хранилище персистентному координатору хранилища вынудит Базовые Данные выполнить работу контрольной точки, объединяющую данные в-walфайл к файлу хранилища. Это - фактически Базовая Магистраль данных для выполнения работы контрольной точки. С другой стороны, если-walфайл не присутствует, с помощью этого подхода, чтобы добавить, что хранилище не вызовет исключений, но транзакций, зарегистрированных в без вести пропавших-walфайл будет потерян.Свяжите основной файл хранилища и
-walфайл в пакет документов и управляет ими как единственным элементом.
Для получения дополнительной информации об изменении режима журналирования значения по умолчанию, см. сеанс 2013 года WWDC 207 Новые функции и возможности в Базовых Данных и iCloud.
Примечание: В iOS 6.x и Пума, значение по умолчанию является режимом журналирования отката, в котором Базовые Данные создают a -journal файл для временного хранения транзакций, обновляет основной файл хранилища на месте и удаляет -journal файл после сохранения контекста. Файл хранилища поэтому содержит актуальную базу данных.
История версии документа
| Дата | Примечания |
|---|---|
| 29.01.2014 | Новый документ, описывающий изменение в режиме журналирования значения по умолчанию для Базовых Данных хранилища SQLite и потенциальное влияние. |