2014年6月12日木曜日

iOSアプリでSQLiteを簡単に使えるFMDB

iOSアプリでデータベースを使いたくなることがあります。
でも、Core Dataはなんだか取っ付きにくいですよね。
そこで、SQLiteを使ってみてはいかがでしょうか?
FMDBというライブラリを使えばiOSアプリでも簡単に使えます。


準備



1.ライブラリをダウンロード


https://github.com/ccgus/fmdb



2.ライブラリを追加


ライブラリの『fmdb』以下にあるファイルを全部Xcodeに追加する。



3.フレームワークの追加


『libsqlite3.0.dylib』を追加する。



使い方



初期処理


#import "FMDatabase.h"


//FMDB
FMDatabase *db;

//DBファイル名
NSString *DB_FILE = @"test_db.sqlite3";

//DBファイルのパスを取得
NSString *dbPath = nil;
NSArray *documentsPath = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);

//取得データ数を確認
if ([documentsPath count] >= 1) {
    
    //固定で0番目を取得
    dbPath = [documentsPath objectAtIndex:0];
    
    //パスの最後にファイル名を追加
    dbPath = [dbPath stringByAppendingPathComponent:DB_FILE];
} else {
    
    //エラー
    NSLog(@"database file not found.");
}

//DBファイルがDocument配下に存在するか判定
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:dbPath]) {
    
    //存在しない場合、DBファイルをコピー(初回起動時のみ)
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *orgPath = [bundle bundlePath];
    orgPath = [orgPath stringByAppendingPathComponent:DB_FILE];
    
    //DBファイルをDocument配下へコピー
    NSError *error = nil;
    if (![fileManager copyItemAtPath:orgPath toPath:dbPath error:&error]) {
        
        //エラー
        NSLog(@"db file copy error. : %@ to %@.", orgPath, dbPath);
    }
}

//パスを設定して、データベースオープン
db = [FMDatabase databaseWithPath:dbPath];
[db open];



//処理が終わったら、データベースクローズ
[db close];




SELECT


//クエリ実行
NSString *query = @"SELECT item_id, word, date FROM items WHERE word = ? ";
FMResultSet *rs = [db executeQuery:query, @"test1"];

if ([db hadError]) {
    //エラー
    NSLog(@"db execute error");
}

//結果の取得(カラム名指定)
while ([rs next]) {
    
    //数値の取得
    int itemID = [rs intForColumn:@"item_id"];
    
    //文字列の取得
    NSString *word = [rs stringForColumn:@"word"];
    
    //日付の取得
    NSDate *date = [rs dateForColumn:@"date"];
}

//ResultSetのクローズ
[rs close];




INSERT


NSString *word = @"test1";
NSString *mean = @"テスト1";

//INSERT実行
NSString *sql = @"INSERT INTO items (word, mean) VALUES (?, ?) ";
[db executeUpdate:sql, word, mean];

if ([db hadError]) {
    //エラー
    NSLog(@"db insert error");
}



UPDATE


NSNumber *itemID = [NSNumber numberWithInt:12345];
NSDate *timeStamp = [NSDate date];

//UPDATE実行
NSString *sql = @"UPDATE items SET date = ? WHERE item_id = ? ";
[db executeUpdate:sql, timeStamp, itemID];

if ([db hadError]) {
    //エラー
    NSLog(@"db update error");
}



DELETE


NSNumber *itemID = [NSNumber numberWithInt:12345];

//DELETE実行
NSString *sql = @"DELETE FROM items WHERE item_id = ? ";
[db executeUpdate:sql, itemID];

if ([db hadError]) {
    //エラー
    NSLog(@"db delete error");
}



まとめ


RDBを使ったことがある人は簡単ですよね。
Core DataでDBを使うことを断念した人も、FMDBでSQLiteを検討してみてはいかがでしょうか。


せり上がってくる数字と演算子で計算式を作り消して行く
5つ正解でクリアー、全30ステージの知育系パズルゲーム


0 件のコメント:

コメントを投稿