2010/06/21

[Objective-C][sqlite][iPad]CREATE文の発行

今、sqliteを使ってDBの管理を行おうとしているのですが、やっと、CREATE文の発行ができたので、そのプログラムの紹介です。

参考にさせていただいたのは、SQLite Tutorial - Selecting Data

上のエントリーでは、sqliteのdbをfirefoxのアドオンを使って作成して、それをObjective-Cを使ってiPhoneのアプリ内のディレクトリにコピーしているプログラムなのだが、そのやり方になんだか違和感を感じてしまったので、データベースの作成からObjective-Cで始めて、そこから、CREATE文の実行を行い、ターミナルで確認する作業を紹介します。

では、さっそくいきます。

//dbが存在しているかどうかの確認
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dbPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"test.db"];
//ファイルが存在しない場合
if (![[NSFileManager defaultManager] fileExistsAtPath:dbPath]) {
//ファイルを作成する
BOOL result = [[NSFileManager defaultManager] createFileAtPath:dbPath contents:nil attributes:nil];
//ファイル作成が失敗した場合
if (!result) {

}
BOOL sql_exec_ok = NO;
sqlite3 *db;
int ret;
//sqliteをオープンする
ret = sqlite3_open([dbPath UTF8String],&db);
//sqliteのオープンに成功した場合
if (ret == SQLITE_OK) {
//sqlの設定
const char *sql = "create table test(column_no1,column_no2)";
//実行するsqlを格納する変数
sqlite3_stmt *sqlstmt;
ret = sqlite3_prepare_v2(db,sql,-1,&sqlstmt,NULL);
//sqlの準備完了の場合
if(ret == SQLITE_OK){
//sqlの実行を行う
ret = sqlite3_step(sqlstmt);
//sqlの実行が正常終了した場合
if(ret == SQLITE_DONE){
//sql文の解放
sqlite3_finalize(sqlstmt);
sql_exec_ok = YES;
}
}
}

//sqliteをクローズする
sqlite3_close(db);

//テーブルの作成が正常に完了できなかった場合
if(!sql_exec_ok){

}
}

まず最初の2行で、iPhoneのDocumentフォルダにあるtest.dbというファイルの確認を行います。

ファイルが存在する場合は、何も処理を行いません。

ファイルが存在しない場合は、一つ目のif文を通かした後の、処理でファイルの作成を行います。
(さらなる詳細については、[Objective-C][iPad]ファイルを書き出すを参照のこと)

で、ここからが重要で、まず、sqlite3_open関数を使って、データベースをオープンします。

オープンに成功した場合は、その勢いに乗っかって、sql文を記述します。

記述完了後、今度は、sqliteを実行するぞーっというのをプログラムに伝えるために、sqlite3_prepare_v2関数を使います。
(ここは、sqlite3_prepareもありますが、ドキュメントでは、sqlite3_prepare_v2が推奨されています。)

if文を使って準備がオッケーだった場合、sqlite3_step関数を使って、いざ実行

実行が正常終了した場合、sqlite3_finalize関数を使って、sql文の解放を行います。

そして、最後に、sqlite3_close関数を使って、データベースをクローズします。

script系言語からdbを触ったことがある方には、sql文の解放作業と準備作業というものがあることに少し気持ち悪さを感じるかもしれません。
(それでも、CFデベロッパーよりもましで、CFの場合、sqlのオープン、クローズの概念がないので、おそらくそれ以上に気持ち悪さを感じると思います。)

これを実行すると所定のフォルダに、データベースファイルができており、ターミナルからそのファイルをsqlite3コマンドを使ってオープンすると、確かに、テーブルができていることが確認できました。

ただ、やはりまだプログラム全体に気持ち悪さを感じてしまう。

データベースのオープンや、クローズは、別メソッドにして、そこで管理したりする方が、汎用性が高いかもしれない。
さらに、今回は、CREATE文だけだったから、この量ですんだものの、INSERT文だったり、UPDATE文だったりしたら、もっと増えると考えると、やはり、もっと柔軟に作り返る必要性があるかもしれない。

そこの辺は、また出来次第、改めて、考察していく。

補足;
上で紹介したエントリーに日本語和訳が、あるみたいです。↓で紹介されていました。
■[iPhone]SQLite Tutorialを日本語に訳した 20:22

でも、エントリーをいくら探しても、日本語訳見つからないんだよなー。。。
どうしたもんでしょ?

0 コメント:

コメントを投稿