iPhoneアプリの宿命として、常に進化を求められるわけです。
進化の過程では、扱うデータが増えるのが宿命だったりするわけです。
その一方で、CoreDataは使い難いので、つい「SQLite直叩きで良くね?」とか言っている自分がいるのです。
(日頃から「WebFramework?O/Rマッパー?何ソレ?」とか言っている時点で、あまり相手にされていない自覚はあります。)
・・・という私のような開発者が開発したアプリをバージョンアップさせる時に、必要なのが今回の作業です。
1.FMDatabaseは使わせてくれ
FMDatabase(リンク)は素晴らしいライブラリです。
SQL文を書いて実行したい人は必ず使うべきでしょう。
今回は、これを使っていることを前提としています。
2.SQLiteのバージョンを調べる
そもそも開発時に「libsqlite3.0.dylib」あたりを読み込んでいるはずなので、SQLite2ではなくSQLite3であるのは分かります。
SQLite3でないと「ALTER TABLE」がないらしいので、これはオオゴトです。
ただし、SQLite 3.1.3前後でALTER TABLE後のデータファイルを読めなくなるとか、だからVACUUMしろとか、そういうハナシが出てくるので、ここは実際に使われているSQLiteのバージョンを調べておきましょう。
FMDatabaseのクラスメソッドに「sqliteLibVersion」というのがあるので、こんな感じ。
NSLog(@"%@",[FMDatabase sqliteLibVersion]);
エミュレータで実行すると「3.7.13」、実機(iPhone4)で実行すると「3.7.7」でした。
この様子だと、世間に広まっている実機ではバージョンの心配はしなくて良さそうです.
3.カラムの存在確認をする
「カラムがなければ追加しろ」という指示を出すので、まずは「カラムがない」ことを調べなければなりません。
Googleで調べると、当然と言えば当然なのですが、「PRAGMA table_info(‘テーブル名’);」ということを教えてくれます。
戻り値をグルグル回しながらお目当てのカラム名が“ないこと”を確認するのですね。
“ないこと”の確認ですから、最後までループを回さなければなりません。
面倒感がありありなので、FMDatabaseの中身を見てみたら
- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName;
なんてものがあるじゃないですか。
なので、これを使わせてもらいます。
4.結局こうなった
INTEGER型のカラムを初期値0で追加してみます。
FMDatabase* db = [FMDatabase databaseWithPath:(dbファイルへのパス)]; if(![db open]) { return; // dbのオープンに失敗した } [db setShouldCacheStatements:YES]; [db setCrashOnErrors:YES]; if(![db columnExists:@"(テーブル名)" columnName:@"(カラム名)"]) { NSString* sql = [NSString stringWithFormat:@"ALTER TABLE (テーブル名) ADD COLUMN (カラム名) INTEGER DEFAULT 0"]; [db executeUpdate:sql]; }
今回は以上です。
アプリのアップデート時にはiPhone内の「Documents」ディレクトリ以下は更新されません。
これはユーザの利用ログやデータを継続するためです。
dbファイルもこのディレクトリ以下に格納されますので、バージョンアップに伴うdbの変更はプログラムで書かなければならないのです。
FMDatabaseを使っていれば、見た目もシンプルに書けましたね、ということでした。
ロゴスウェア
最新記事 by ロゴスウェア (全て見る)
- Amazon Linux(EC2)と PHPSTORM で Xdebug を行う - 2018年9月26日
- やらないことの合意 - 2018年6月27日
- 卒園アルバムとプロジェクトマネジメント - 2018年3月30日
Comments are closed.