Tasaki です。
このテーマもついに5回までやってきました。
前回まででデータベースの読み込み部分の実装はできあがっていますので、今回はデータの追加部分を考えます。
ここでは、メモリに展開中のデータ配列に新たなデータが追加されたとき、同時にデータベースへのコミットを行うことで対処することにします。
そこで、前回ご紹介した Person クラスに次のメソッドを追加します。
// Person オブジェクトの新規追加用メソッド
- ( id ) initWithID:( NSUInteger ) id name:( NSString *) name database:( sqlite3 *) db {
if( name == nil || db == NULL ) {
return nil;
}
if(( self = [ super init ]) != nil ) {
database = db;
static char *sqlString = "INSERT INTO person VALUES(?,?)";
sqlite3_stmt *statement = NULL;
if( sqlite3_prepare_v2( database, sqlString, -1, &statement, NULL ) == SQLITE_OK ) {
int i = 1;
sqlite3_bind_int( statement, i++, id );
sqlite3_bind_text( statement, i++, [ name UTF8String ], -1, SQLITE_TRANSIENT );
if( sqlite3_step( statement ) != SQLITE_ERROR ) {
self.id = id;
self.name = name;
[ name retain ];
} else {
// データベースへの登録に失敗
NSLog( @"Insertion Error : failed to step with '%s'.", sqlite3_errmsg( database ));
}
sqlite3_finalize( statement );
} else {
NSLog( @"Insertion Error : failed to prepare with '%s'.", sqlite3_errmsg( database ));
}
}
return self;
}
このメソッドの返り値が空でなければ、それをデータ配列へ追加することでメモリ上とディスク上のデータの整合性が保たれることになります。(注:上記のコードでは、データベースへの登録に失敗したケースなどでは不整合が生じますが、name が nil になっているので外部から判別可能です)
ただ、id は主キーなので、呼び出し側で一意な値を渡しておかなければなりません。
今回、SQL ステートメント内部で ? パラメータと bind 関数を使用して値を渡していますが、このときのインデックスは 1 から始まりますので注意しましょう。
さて、これで読み出しと書き込みについての解説は終わりました。次回は削除を採りあげる予定ですが、前回のエントリでほとんど解決しちゃってる気がします。
- 関連記事
-
スポンサーサイト
trackbackURL:http://appteam.blog114.fc2.com/tb.php/79-91b3efbe