iOS7からSQLiteファイルがWALモードになっていてアプリが落ちる件
事象
iOSアプリでデータを差し替えるのに申請しないといけないのが面倒だったため、WEBシステムと連携させて新しいSQLiteをダウンロードしてアプリ内の既存SQLiteと差し替えて対応していた。
しかしiOS7の端末でSQLiteの差し替えを行うとクラッシュしてしまった。
原因
iOS7からCoreDataで生成されるSQLiteのモードが今までのjournal_modeからwalモードに変更したことが原因だった。
確かにXcodeの[Organizer]から該当のアプリをダウンロードして中身を見ると
.sqliteファイル以外に.sqlite-walと.sqlite-shmというファイルが生成されていた。
対処
対処方法としてはiOS7であってもCoreDataから生成されるSQLiteのモードをjournal_modeに変えてしまえばいけた。
もしくは私の事象の場合は、ダウンロードしてきた.sqliteをコピーする前にアプリに存在している.sqliteと.sqlite-walと.sqlite-shmの3ファイルを削除してからダウンロードした.sqliteをコピーすることで動くようになった。
(.sqlite-walと.sqlite-shmは.sqliteをコピーした際にできるみたい)
やり方
journal_modeに変更編
NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} };
上記オプションをNSPersistentStoreCoordinatorのaddPersistentStoreWithType:メソッドのオプションに設定すればOK.