Core Data и iOS 7: различное поведение постоянного хранилища

Я готовлю обновление для приложения на основе Core Data для исправлений с iOS 7. Я использую Xcode 5 и iOS 7 SDK GM. Однако я понял другое поведение постоянного хранилища (это UIManagedDocument): до сборок iOS 7 в папке документов был только один файл persistentStore (иногда был второй persistentStore-journal).

В сборках iOS 7 (чистая установка) теперь есть три файла для постоянного хранилища:

  • persistentStore
  • persistentStore-wal и
  • persistentStore-shm

Apple изменила режим журнала по умолчанию на WAL? Интересно, влияет ли это на мое приложение (подумайте о том, как пользователи обновляются с последней версии)? Не лучше ли отключить WAL - и если да, то как это сделать с iOS 7 / UIManagedDocument?


person FrankZp    schedule 18.09.2013    source источник
comment
Возможно, посмотрите сеанс Что нового в Core Data и iCloud на WWDC 2013. Вы можете загрузить PDF-файл со страницы developer.apple.com/wwdc/videos. Apple изменила режим ведения журнала по умолчанию для файла SQLite с отката на ведение журнала с упреждающей записью.   -  person Martin R    schedule 18.09.2013


Ответы (1)


Да, Apple изменила режим журнала по умолчанию на WAL для iOS7. Вы можете указать режим журнала, добавив параметр NSSQLitePragmasOption к параметрам при вызове addPersistentStoreWithType: configuration: url: options: error. Например. чтобы установить предыдущий режим УДАЛЕНИЯ по умолчанию:

NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} };

По моему опыту, WAL дает лучшую производительность, но также посмотрите этот пост:

iOS CoreData - есть ли недостатки для включение sqlite WAL / записи с упреждающей записью

person Andy Etheridge    schedule 18.09.2013
comment
Привет, @Andy, в вашем коде есть небольшая орфографическая ошибка. Он должен читать @journal_mode. - person ajmccall; 24.09.2013
comment
@ajmccall Я исправил опечатку в journal_mode проверьте все параметры sqlite.org/pragma.html . - person Chris Wagner; 04.10.2013
comment
У нас есть приложение, в котором пользователи начали жаловаться на потерю своих данных при обновлении до последней версии, которая была скомпилирована для iOS 7. Изменение режима журнала обратно на DELETE решило нашу проблему. - person Rickster; 06.12.2013
comment
Это ужасный способ развернуть эту функцию. Apple должна была знать лучше, чем автоматически включать эту функцию. Теперь, чтобы создать резервную копию базы данных, у пользователей должны быть оба файла ... У меня были сотни потерянных данных пользователей, когда они восстанавливали свои устройства ios из резервных копий после обновления ios7 только для того, чтобы обнаружить, что файл WAL отсутствует, поэтому все данные поскольку переход на ios 7 ушел ... простое обновление устройства до ios7 меняет способ хранения данных в приложении. Кто думал, что это хороший дефолт - person J3RM; 28.01.2014
comment
Добавьте меня в список сгоревших разработчиков, которые тоже не заметили эту проблему заранее. У меня тоже сработала опция DELETE. - person Bek; 13.02.2014
comment
@Andy Etheridge, я уже использую это, NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool: YES], NSInferMappingModelAutomatically; Теперь, если я заменю это на NSDictionary * options = @ {NSSQLitePragmasOption: @ {@ journal_mode: @DELETE}}; Если это работает нормально или в будущем возникнет какая-либо ошибка? - person Maniganda saravanan; 05.03.2014
comment
Core Data на Mavericks проигнорирует настройку через некоторое время, когда будет казаться, что постоянное хранилище автоматически перезагружает хранилище. - person Conor; 05.06.2014