タイトル通りです。iPhoneアプリでデータベースを使う方法を紹介する感じです。
iOSではAndroidと同じようにSQLiteが使えるみたいですね。
今回はFMDBというライブラリを使って簡単にデータベースを作れる方法を紹介してみます。
SQLiteはサーバーにインストールとかそういうのは要らず、
たった1つのファイルがあればデータベースが使えてしまうという便利な奴です。
使用する時はアプリの中にファイルが作られます、アプリ専用のデータベースですね。
今回は実際にDBを作成、テーブルの作成、INSERTとSELECTまでやってみます。
FMDBをダウンロード、プロジェクトに追加する
まずはiOSでSQLiteを使いやすくしてくれるライブラリ「FMDB」をダウンロードしてきます。
GitHubで公開されているのでこちらからダウンロード。
https://github.com/ccgus/fmdb
ダウンロードしたZIPファイルを解凍。
中にある「src」フォルダの中にある以下のファイルをプロジェクトに追加します。
- FMDatabase.h
- FMDatabase.m
- FMDatabaseAdditions.h
- FMDatabaseAdditions.m
- FMDatabasePool.h
- FMDatabasePool.m
- FMDatabaseQueue.h
- FMDatabaseQueue.m
- FMResultSet.h
- FMResultSet.m
たくさんあるので、FMDBというグループを作って中に入れました。

SQLiteを使用するためのライブラリ「libsqlite3.0.dylib」を追加
プロジェクトにSQLiteを使用するためのライブラリを追加します。
Build phasesを開き、 Link Binary With Libraries を選択。
+をクリックして、libSQLで検索、候補にでてきた「libsqlite3.0.dylib」を選択してAddを押して追加。


こんな感じ。
これでDBを扱うための設定は完了です。
データベースとテーブルを作成する
ここから先はソースコードを書いていきます。
使う箇所ではプロジェクトに追加したFMDBをimportします。
#import "FMDatabase.h"
(1) DBを作るパスとファイル名を取得します
(2) FMDBのクラスのインスタンスを作成します
(3) テーブル作成用のSQL文を用意します
(4) SQLを実行します
- (void)viewDidLoad
{
[superviewDidLoad];
//(1)
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex:0];
NSString *db_path = [dir stringByAppendingPathComponent:@"test.db"];
NSLog(@"%@", db_path );
//(2)
FMDatabase *db = [FMDatabasedatabaseWithPath:db_path];
//(3)
NSString *sql = @"CREATE TABLE IF NOT EXISTS members (id INTEGER PRIMARY KEY , name TEXT ); ";
[db open];
//(4)
[db executeUpdate:sql];
[db close];
}
実行させると、アプリの中のDBが作成されます。
ログに実際に作られた場所が表示されるので、ちゃんと作成されているか調べてみます。
(実機の場合は、Organizerでアプリの中身をダウンロードすれば調べられます)

「test.db」というファイルが作成されています。
ちゃんとテーブルが作成されているか、SQLiteクライアントソフトを使って確認してみます。
「SQLite」データベースの管理ソフト「Lita」を使ってDBの中身を確認
Litaはフリーソフトなのでこちらからダウンロードできます。
http://www.dehats.com/drupal/?q=node/58
(AIRというFLASHの親戚みたいな仕組みで動いているので、動かすにはAIRのインストールが必須です。)
インストールが済んだら、実際にdbファイルを開いてみましょう。
テーブルが作られているのが確認できます。

INSERT文でレコードを追加
NSString型のINSERT文のSQLを作成して、
executeUpdateメソッドの引数に指定して実行します。
/*
中略
*/
FMDatabase *db = [FMDatabasedatabaseWithPath:@"データベースのパス"];
NSString *insert_sql = @"INSERT INTO members (id,name) VALUES (?,?)";
[db open];
[db executeUpdate:insert_sql ,@"1",@"名前a"];
[db executeUpdate:insert_sql ,@"2",@"名前b"];
[db executeUpdate:insert_sql ,@"3",@"名前c"];
[db close];
実行するとこんな風にレコードが作成されます。

SELECT文でレコードを抽出
先ほど作成したレコードを今度はSELECT文で抽出してみます。
NSString型のSELECT文のSQLを作成して、
executeQueryメソッドの引数に指定、戻り値をFMResultSet型で受け取ります。
FMResultSetクラスのnextメソッドで取得したデータの件数だけループ処理をします。
今回の例では、INTEGER型のidカラムをintForColumnメソッドで、
TEXT型のnameカラムをstringForColumnメソッドで取得しています。
/*
中略
*/
FMDatabase *db = [FMDatabasedatabaseWithPath:@"データベースのパス"];
NSString *select_sql= @"SELECT id, name FROM members;";
[db open];
FMResultSet *result = [db executeQuery:select_sql];
while ( [result next] ) {
int result_id = [result intForColumn:@"id"];
NSString *result_name = [result stringForColumn:@"name"];
NSLog(@"recode id[%d] name [%@]", result_id , result_name);
}
[db close];
以上です。
アップデートとかも簡単に出来そうです
|
|
: : :::::::,. -─´、て
::: :: :::Σco===、!,_
: : :: :::::l´i(ノリハノリ) LitaとかAIRとかいう単語を観てると鍵っ子の血が騒ぎます…
: : :::::ルlリ⊃⊂ヽ 次はテーブルに初期データを入れたものをコピーして使う方法を紹介してみたいです
: : ::::(( //xxxxヽ、─────────────────
/~~~
./
