電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

iPhoneSDKでSQLiteを使う方法

SQLiteのメモ
SQLiteのDBファイルはアプリのドキュメントフォルダにある必要がありますが、今回はリソースフォルダに初期DBファイルを置き、ドキュメントフォルダに存在しない場合(初回起動)の場合にリソースフォルダよりコピーして使う方法をとります。
SQLiteやDBの知識があることを前提にして書いてるので、SQLに関することは別で調べてください。

DBファイルの作成と追加

OSX上でsqliteを使ってDBファイルを作成します。
例としてテーブルを1つだけ定義したファイルを作成します。

$ sqlite3 test.db
sqlite> create table TABLEA (
   ...> a integer,
   ...> b text
   ...> );

作成したDBファイルをプロジェクトの"Resources"へ追加します

SQLiteのファイルを管理するのに便利なツールを紹介します。Adobe Airの環境で動きます。
Lita - SQLite Administration Tool

SQLite用ライブラリの追加

SQLiteを使うためのライブラリ"libsqlite3.0.dylib"をプロジェクトの"Frameworks"へ追加します。
libsqlite3.0.dylib"は
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS(OSのバージョン).sdk/usr/lib/
にあります。リンクファイルではなく、実ファイルを選択してください。

DBファイルのコピーとファイル名取得。

ドキュメントフォルよりDBファイルのパスを含むファイル名を取得します。ドキュメントフォルダに存在しない場合(初回起動)の場合にリソースフォルダよりコピーしたあと、パスを含むファイル名を取得します。

BOOL success;
NSError *error;	
NSFileManager *fm = [NSFileManager defaultManager];
NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *databasepath = [documentsDirectory stringByAppendingPathComponent:@"test.db"];
NSString *dbpath = [[NSString alloc] initWithString:databasepath];
success = [fm fileExistsAtPath:dbpath];
if(!success){
	NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.db"];
	success = [fm copyItemAtPath:defaultDBPath toPath:dbpath error:&error];
	if(!success){
		NSLog([error localizedDescription]);
	}
}
// 処理後にどこかで [dbpath release] を実行すること!

dbpathにDBファイルのファイル名が代入されます。

DBのオープン

DBのオープン〜SQL実行〜検索結果取得〜DBクローズ
test.dbにいくつかデータが入っていると仮定します。

// DBのオープン
if (sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) {
	// SQL文の定義
	char *sql = "select A,B from TABLEA";
	// SQLを実行して結果を取得
	sqlite3_stmt *statement;
	if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
		// 取得件数分繰り返し
		while(sqlite3_step(statement) == SQLITE_ROW) {
			// 数値項目 A(0番目の項目) の取得
			NSInteger a = sqlite3_column_int(statement, 0);
			// 文字列項目 B(1番目の項目) の取得
			NSString *b = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
			// コンソールに結果を表示
			NSLog(@"A:%d, B:%s", id, [name cStringUsingEncoding:NSUTF8StringEncoding]);
		}
		sqlite3_finalize(statement);
	}
	// DBのクローズ
	sqlite3_close(database);
}

SQLiteのデータ型

TEXT 文字列
INTEGER 整数
REAL 小数
BLOB バイナリ

iPhone デベロッパーズ クックブック

iPhone デベロッパーズ クックブック