Takahiro Octopress Blog

-1から始める情弱プログラミング

FMDBを使ったDB接続を関数化しよう!!

FMDBを使ったDB接続を自作関数化

さて、ブログを更新します。以前、FMDBを使って簡単にiPhoneのローカルストーレジを活用しよう!でObjective-CでSQLiteを扱うためのFMDBライブラリについて説明させて頂きました。
そのときは全てをベタ書きしていましたが、毎回書くのは面倒ですよね…ってことで自作しちゃいましょう!!

まずはおさらいです。DB接続は下記です。

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

これをtableの作成, select, insert, update, delete, countのたびに書くのは面倒なので…

1
2
3
4
5
6
7
8
- (id)dbConnect:(NSString *)dbName
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
  NSString *dir = [paths objectAtIndex:0];
  FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:dbName]];

  return db;
}

としちゃいましょう。
そうすれば、同じmファイル内であればtableの作成, select, insert, update, delete, countは以下のように書けます。

tableの作成

1
2
3
4
5
6
7
8
9
10
11
- (void)createTable:(NSString *)tableName
{
  FMDatabase *db = [self dbConnect:@"test.db"];
  
  // tableの作成
  NSString *sql = [[NSString alloc] initWithFormat:@"create table if not exists %@ (id INTEGER PRIMARY KEY, uid TEXT, createtime TEXT)", tableName];
  
  [db open];
  [db executeUpdate:sql];
  [db close];
}

select文の実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (void)selectData:(NSString *)tableName
{
  FMDatabase *db = [self dbConnect:@"test.db"];
  
  // select文
  NSString *sql = [[NSString alloc] initWithFormat:@"select * from %@", tableName];

  [db open];

  FMResultSet *rs = [db executeQuery:sql];
  while([rs next]) {
      NSInteger idNum = [[rs stringForColumnIndex:0] intValue];
      NSString *uid = [rs stringForColumnIndex:1];
      NSString *createtime = [rs stringForColumnIndex:2];
      NSLog(@"id: %ld, uid: %@, createtime: %@", (long)idNum, uid, createtime);
  }

  [db close];
}

insert文の実行

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)insertData:(NSString *)tableName
          userID:(NSString *)uid
      createtime:(NSString *)createtime
{
  FMDatabase *db = [self dbConnect:@"test.db"];
  
  // insert文
  NSString *sql = [[NSString alloc] initWithFormat:@"insert into %@ (uid, createtime) values('%@', '%@')", tableName, uid, createtime];

  [db open];
  [db executeUpdate:sql];
  [db close];
}

update文の実行

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)updateData:(NSString *)tableName
          userID:(NSString *)uid
      createtime:(NSString *)createtime
{
  FMDatabase *db = [self dbConnect:@"test.db"];
  
  // update文
  NSString *sql = [[NSString alloc] initWithFormat:@"update %@ set uid='%@', createtime='%@' where id=1", tableName, uid, createtime];

  [db open];
  [db executeUpdate:sql];
  [db close];
}

delete文の実行

1
2
3
4
5
6
7
8
9
10
11
- (void)deleteData:(NSString *)tableName
{
  FMDatabase *db = [self dbConnect:@"test.db"];
  
  // delete文
  NSString *sql = [[NSString alloc] initWithFormat:@"delete from %@", tableName];

  [db open];
  [db executeUpdate:sql];
  [db close];
}

count文の実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (NSInteger)countData:(NSString *)tableName
{
  FMDatabase *db = [self dbConnect:@"test.db"];

  // count文
  NSString *sql = [[NSString alloc] initWithFormat:@"select count(*) as count from %@", tableName];
  
  [db open];
  FMResultSet *rs = [db executeQuery:sql];
  NSInteger cnt = 0;
  if([rs next]) {
      cnt = [rs intForColumn:@"count"];
  }
  [db close];

  return cnt;
}

一度、関数を作ってしまえば、使いやすさがぐんぐん増します!!
自身のiOSアプリに最適なSQLiteを扱うメソッドを作ってみてはどうでしょうか?

Comments