[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.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

Comments are closed.