超簡単にSqliteをつかう
iPhoneで超簡単にSqliteをつかってみた。
http://iphone-dev.g.hatena.ne.jp/ktakayama/20080922/1222096534
などを見るとすごく面倒そうなので、適当なObjective-cのライブラリをひろってきただけ、ともいう。
ステップ
- SqliteのDBを生成し、Xcodeに登録する
- SqliteのライブラリをXcodeに登録する
- SqliteのObj-cライブラリであるFMDBをDlしてきて、Xcodeに登録する
- 色々コーディング
DBを作成し、ライブラリを追加するところまでは
http://icodeblog.com/2008/08/19/iphone-programming-tutorial-creating-a-todo-list-using-sqlite-part-1/#create-db
が(英語だけど)参考になります。
SqliteのDBを生成し、Xcodeに登録する
TerminalでSqlite3をたたいてdbを作成する。
MAC:sqlite uzulla$ sqlite3 db.sqlite SQLite version 3.5.9 Enter ".help" for instructions sqlite> create table checkr ( ...> itemId INTEGER PRIMARY KEY, ...> titleText VARCHAR(255), ...> statusCode INTEGER ...> );
こんな感じ。
出来たファイルをXcodeのResourcesにDnDし、追加する。
(この辺り前述のサイトが参考になります)
SqliteのダイナミックリンクライブラリをXcodeに追加する
XcodeのFrameworksを右クリックして、追加>既存のフレームワーク を選択。
ダイアログ右上の検索の所に、libsqlite3といれるとずらっと同名称のファイルがでるので、一つ一つみて、ファイルサイズが1.7Mbyteの物を選択する(数Kbyte程度の物は外れ)
(この辺り前述のサイトが参考になります)
SqliteのObj-cライブラリであるFMDBをDlしてくる
http://www.gusmueller.com/blog/archives/2005/3/22.html
ここがサイト。
svn co http://flycode.googlecode.com/svn/trunk/fmdb fmdb
でDLできる。
DLしたらsrcの中の
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMResultSet.h
FMResultSet.m
これで適当なソースとかで
#import "FMDatabase.h"
とかが補完で入力できるようになるはず。
(補完できなかったら登録できていないかも)
色々コーディング
.h #import "FMDatabase.h" #import "FMDatabaseAdditions.h" -- .m NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"]; BOOL success = [fileManager fileExistsAtPath:writableDBPath]; if(!success){ NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"]; success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; } if(!success){ NSAssert1(0, @"failed to create writable db file with message '%@'.", [error localizedDescription]); } //ここまでがDBファイルのPathを取得する所、ここから下が実際にSqliteを操作する所 FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath]; if (![db open]) { NSLog(@"Could not open db."); return 0; } [db setShouldCacheStatements:YES]; [db beginTransaction]; [db executeUpdate:@"insert into checkr (itemId,titleText,statusCode) values (?, ?, ?)" , [NSNumber numberWithInt:1], //注1 @"test2", [NSNumber numberWithInt:0]]; [db commit]; FMResultSet *rs = [db executeQuery:@"select * from checkr"]; while ([rs next]) { NSLog(@"%d %@ %d ", [rs intForColumn:@"itemId"], [rs stringForColumn:@"titleText"], [rs intForColumn:@"statusCode"]); } [rs close]; [db close];
こんな感じで。
注1の所はプリミティブなintではダメらしいので、NSNumberで指定してあげる。
(ビルドは通るけど、実行時にエラーになる)
ちゃんとPrepared statementサポートですよ、偉いねー。
まだ実機だとか、日本語が通るかとかはきっちりためしていないですが、たったこれだけでつかえるようになる。すばらしい。
まとめ
GoogleCodeをみれば大抵のライブラリってあるねー。