LoginSignup
0
2

More than 3 years have passed since last update.

【Objective-C】FMDBの利用方法

Posted at

FMDBとは?

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

FMDBの使用方法

1:DBの接続

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

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

2:DBの開閉

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

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

3:テーブルの作成

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

//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を叩きます。

//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]) {
//1番目のカラムをuidに格納します。
  uid = [rs stringForColumnIndex:1];
}
[db close];

insert文の実行

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

//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に存在する値を更新したいと思います。

//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にレコードが1つ追加されていて、その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文の実行をすることで、レコードを削除します。

//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文で各当のカラムをいくつあるのか数えてたいと思います。

//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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2