【Objective-C】FMDBの利用方法

#FMDBとは？
FMDBとはiOSでの開発においてSQLiteを扱いやすくするためのライブラリです。
下記にGitHubを載せておきます。
https://github.com/ccgus/fmdb

#FMDBの使用方法
###1:DBの接続
まずDBをプログラム上で扱うために接続します。
DBの接続コードは下記のみになります。stringByAppendingPathComponentに任意の値を設定することによって、DBに命名できます。

```objective_c
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];
```

###2:DBの開閉
DBを使用するためには開閉の操作が必要になります。DBを操作する時に開き、操作が終わったら閉じましょう。

```objective_c
//DBを開く処理
[db open];
//DBを閉じる処理
[db close];
```

###3:テーブルの作成
先ほど紹介した開閉処理も使い、DBにテーブルを作成します。
処理は至ってシンプルで開いたDBにテーブル作成のSQLをexecuteUpdateで叩いてあげるだけです。

```objective_c
//DBの接続
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];

//tableの作成SQLを設定
NSString *sql = @"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,uid TEXT,createtime TEXT);";
//DBを開く
[db open];
//sqlを実行し、テーブルを作成
[db executeUpdate:sql];
//処理が終了したので、DBを閉じる
[db close];
```

###4:select文の実行
次にselect文を実行し、任意の値をテーブルから取得します。
基本的には先ほどのテーブル作成の処理と一緒で、値を抽出するためのSQLを叩きます。

```objective_c
//DBの接続
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];

//select文の作成（passwordカラムを取得します）
NSString *select = [[NSString alloc] initWithFormat:@"SELECT * from password"];
[db open];
//SQLを実行し、rsに取得結果を格納します。
FMResultSet *rs = [db executeQuery:select];
NSString *uid;
while([rs next]) {
//１番目のカラムをuidに格納します。
  uid = [rs stringForColumnIndex:1];
}
[db close];
```

###insert文の実行
次にinsert文で値を追加します。先ほどと同様にSQLを実行し、任意の値の追加処理を行います。

```objective_c
//DBの接続
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];

//insert文の作成
NSString *createtime = @"20131130011728462";
NSString *uid = @"user01";
//値追加のSQL文を作成
NSString *insert = [[NSString alloc] initWithFormat:@"INSERT INTO users(uid, createtime) VALUES('%@', '%@')", uid, createtime];
[db open];
//実行
[db executeUpdate:insert];
[db close];
```

###update文の実行
次にupdate文を実行することで、すでにDBに存在する値を更新したいと思います。

```objective_c
//DBの接続
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];

//update文の作成
NSString *createtime = @"20131201054830467";
NSString *uid = @"user02";
//DBにレコードが１つ追加されていて、そのid=1のレコードを更新しています
NSString *update = [[NSString alloc] initWithFormat:@"UPDATE users SET uid='%@', createtime='%@' where id=1", uid, createtime];
[db open];
[db executeUpdate:update];
[db close];
```

###delete文の実行
次にdelete文の実行をすることで、レコードを削除します。

```objective_c
//DBの呼び出し
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];

//delete文の作成、id=1のレコードを削除。
NSString *delete = [[NSString alloc] initWithFormat:@"DELETE from users where id=1"];
[db open];
[db executeUpdate:delete, [NSNumber numberWithInteger:n]];
[db close];
```

###count文の実行
最後にcount文で各当のカラムをいくつあるのか数えてたいと思います。

```objective_c
//DBの接続
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir = [paths objectAtIndex:0];
NSString *dir = [paths objectAtIndex:0];
FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"test.db"]];

//count文の作成
//以下ではuidカラムがuser02の値が設定されているのがいくつあるか数えています。
NSString *uid = @"user02";
NSString *cntquery = [[NSString alloc] initWithFormat:@"select count(*) as count from users where uid=%d", uid];
[db open];
FMResultSet *cntrs = [db executeQuery:cntquery];
if([cntrs next]) {
  NSString *count = [cntrs intForColumn:@"count"];
}
[db close];
```

#参考
https://grandbig.github.io/blog/2013/11/30/fmdatabase/
https://akabeko.me/blog/2017/01/fmdb/
https://github.com/ccgus/fmdb