.17 2009

SQLite を使ってみる(5)

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 から始まりますので注意しましょう。


さて、これで読み出しと書き込みについての解説は終わりました。次回は削除を採りあげる予定ですが、前回のエントリでほとんど解決しちゃってる気がします。



関連記事
スポンサーサイト



Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/79-91b3efbe

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク