c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

超簡単にSqliteをつかう

iPhoneで超簡単にSqliteをつかってみた。
http://iphone-dev.g.hatena.ne.jp/ktakayama/20080922/1222096534
などを見るとすごく面倒そうなので、適当なObjective-cのライブラリをひろってきただけ、ともいう。

ステップ

  1. SqliteのDBを生成し、Xcodeに登録する
  2. SqliteのライブラリをXcodeに登録する
  3. SqliteのObj-cライブラリであるFMDBをDlしてきて、Xcodeに登録する
  4. 色々コーディング

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

XcodeのOtherSourcesにDnDして登録する


これで適当なソースとかで
#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をみれば大抵のライブラリってあるねー。