[iPhoneアプリ開発]SQLiteのカラムを追加したい


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を使っていれば、見た目もシンプルに書けましたね、ということでした。

The following two tabs change content below.

谷中

システム開発チームと検証チームのマネージャー。 「疎結合 小さなクラス 分業制」 を裏スローガンとし、これが実現できてこそ、幸せな開発者人生を過ごせるという確信のもと、上流から設計まで口を挟んだり挟まなかったりしています。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>