プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

SQLiteを利用する方法

下記サイトを参考に自分でも試してみました。

利用手順

1. DBファイルとテーブルの作成
2. 必要なライブラリ(FMDB for iPhone, libsqlite3.0.dylib)を追加
3. FMDBのメソッドを利用してSQLiteを利用

DBファイルとテーブルの作成

まずはデータベースとテーブルを作成します。

$ sqlite3 sample.db
sqlite> CREATE TABLE TEST(
   ...>  id INTEGER PRIMARY KEY,
   ...>  name VARCHAR(255)
   ...> );


という風にコマンドでやってもいいですが、ファイルだけ作ったら後はLitaというAIRSQLiteフロントエンドを使ったりすると楽です。作ったファイル(sample.db)はxcodeのプロジェクトに追加します。

必要なライブラリ(FMDB for iPhone, libsqlite3.0.dylib)を追加

まずはAppleが提供しているsqlite操作用のライブラリibsqlite3.0.dylibをプロジェクトに追加します。
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/usr/lib/libsqlite3.0.dylib


これだけでもいいのですが、もう少しCocoaライクに利用するためにFMDB for iPhoneというライブラリを利用します。svn co http://flycode.googlecode.com/svn/trunk/fmdb fmdb などとしてDownload。ライブラリに含まれる下記のファイルをプロジェクトに追加します。

FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMResultSet.h
FMResultSet.m

FMDBのメソッドを利用してSQLiteを利用

SQLの実行手順はライブラリに付属しているfmdb.mを見れば大体分かるのですが、データベースファイルのロード箇所だけ特殊です。実行時に参照するファイルはDocumentフォルダに置かれるみたいなので、予めプロジェクトに追加しておいたファイルをiPhoneのドキュメントフォルダにコピーします。


実行後のファイルをLitaなどで参照する場合は、下記パスのファイルを参照すればOKです。
/Users/xxxx/Library/Application Support/iPhone Simulator/User/Applications/xxxx/Documents/sample.db

  // ファイルがなければプロジェクトフォルダからiPhone Documentフォルダにコピー
  BOOL success;
  NSError *error;	
  NSFileManager *fm = [NSFileManager defaultManager];
  NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
  NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];
  success = [fm fileExistsAtPath:writableDBPath];
  if(!success){
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
    success = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if(!success){
      NSLog([error localizedDescription]);
    }
  }
	
  // DBに接続
  FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
  if ([db open]) {
    [db setShouldCacheStatements:YES];
		
    // INSERT
    [db beginTransaction];
    int i = 0;
    while (i++ < 20) {
      [db executeUpdate:@"INSERT INTO TEST (name) values (?)" , [NSString stringWithFormat:@"number %d", i]];			
      if ([db hadError]) {
        NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
      }
    }
    [db commit];
		
    // SELECT
    FMResultSet *rs = [db executeQuery:@"SELECT * FROM TEST"];
    while ([rs next]) {
      NSLog(@"%d %@", [rs intForColumn:@"id"], [rs stringForColumn:@"name"]);
    }
    [rs close];  
    [db close];
  }else{
    NSLog(@"Could not open db.");
  }