hachinoBlog

hachinobuのエンジニアライフ

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.