iPhoneでSQLite3を使う10(iPhoneアプリリリース後のテーブルの構造変更)

iPhoneアプリをリリース後に、機能追加でテーブルの構造を変更する必要が生じました。sqlite3のDBファイルは、初回のアプリインストール時に作成されて、アプリをバージョンアップした際でも上書きされません。
※アンインストールすると、DBファイルも消えます。逆にアンインストールしなければ前のままです。シミュレータも同様の動きなので開発中は、構造を変えながら進めることもあるかと思いますので注意してください。


FollowManでは、データは毎回クリアするので過去のデータは不要です。アプリ起動時に、下記のようにテーブル削除して新しい構造で作り直す処理を、初回起動時に入れることで対応しました。

-(void)dbInitialize {
	int wasSucceeded;

	// テーブルの削除
	wasSucceeded = sqlite3_exec(db_, "DROP TABLE users", NULL, NULL, NULL);
	if( wasSucceeded != SQLITE_OK ) {
		NSLog(@"drop table users failed=%s",sqlite3_errmsg(db_));
	}
	// テーブルの追加
	wasSucceeded = sqlite3_exec(db_, "CREATE TABLE users ('screen_name' text PRIMARY KEY,'ID' INTEGER,'name' text,'profile_image_url' text,'followers_count' integer,'friends_count' integer,'text' text)", NULL, NULL, NULL);
	if( wasSucceeded != SQLITE_OK ) {
		NSLog(@"create table users failed=%s",sqlite3_errmsg(db_));
	}
	NSLog(@"Initialize end");
}

今回は、単純にテーブルの作り変えで良かったのですが、ユーザが保存したデータを移行しなければいけない場合。
1.別名で新しいテーブルを作る。(CREATE TABLE文)
2.旧テーブルから新テーブルに値を移す。(INSERT文)
3.旧テーブルを削除する。(DROP TABLE文)
4.新テーブルを、旧テーブル名に名前を変える。(ALTER TABLE文)
といった処理が必要でしょう。大変ですね。


※2.のSQLですが

INSERT INTO new_table FROM (SELECT col1,col2,'値' FROM old_table)

といった形で、1文で済ませることができます。INSERT先のテーブルとSELECT文の列数は同じにする必要があります。
あまりやりたくない、処理なので最初にきっちりDB設計を行うことが大事ですね。今回はここまで・・・