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というAIRのSQLiteフロントエンドを使ったりすると楽です。作ったファイル(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."); }