タイトル通りです。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ヽ、─────────────────
/~~~
./