.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.15 2009

SQLite を使ってみる(3)

Tasaki です。

今回から、データベースを実際にコード中で操作してみます。

まずは、データベースからの読み込み部分を作成します。
これはアプリケーションの初期化時に呼び出すことになりますので、初めに実装しておくべき点です。当然、初めはデータが登録されていないどころか、データベースファイルが存在しないでしょうから、これを作成するところもコード化する必要があります。

ただ、前回のエントリで作成したテンプレートをそのままデータベースとして取り込めばいいわけですから、この部分に関しては楽ができます。
これを踏まえて、手順としては次のようになります。
①ドキュメントディレクトリ内にデータベースファイルがあるか確認する
②なければ、アプリケーションバンドルからデータベースのテンプレートファイルをドキュメントディレクトリにコピーする
③テンプレートファイルが見つからなければエラー終了
④データベースファイルからデータを読み込む

上記①~③のコード例を以下に示します。引数には、データベースファイルの絶対パスを与えます。なお、ドキュメントディレクトリの取得法については、ここでは触れません。

- ( BOOL ) initDatabase:( NSString *) path {
NSFileManager *fileManager = [ NSFileManager defaultManager ];
if([ fileManager fileExistsAtPath: path ] == NO ) {
  // DB ファイルが無い場合は DB を作成
  NSString *dbTemplatePath = [[[ NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent: @"mydatabase.sqlite" ];
  if([ fileManager fileExistsAtPath: dbTemplatePath ] == NO ) {
   // DB テンプレートが見当たらない場合は、エラー終了
   NSLog( @"DB template file is not found." );
   return NO;
  }
  // テンプレートをドキュメントディレクトリへコピー
  NSError *error = nil;
  if([ fileManager copyItemAtPath: dbTemplatePath toPath: path error: &error ] == NO ) {
   // DB テンプレートをコピーできない場合は、エラー終了
   NSLog( @"DB file could not be created with following message. '%@'", [ error localizedDescription ]);
   return NO;
  }
 }
return YES;
}


さてこの後は、いよいよデータベースからデータを読み込みます。
以下のコードでは、引数 data に読み込んだデータの配列を、path には、データベースファイルの絶対パスを与えます。
返り値は、データベースへのポインタです。

- ( sqlite3 *) loadPersonData:( NSArray *) data FromDB:( NSString *) path {
sqlite3 *database = NULL;
if( sqlite3_open([ path UTF8String ], &database ) == SQLITE_OK ) {
  // DB ファイルオープン成功
  sqlite3_stmt *statement = NULL;
  const char *allSelect = "SELECT * FROM person";
  int status = sqlite3_prepare_v2( database, allSelect, -1, &statement, NULL );
  if( status == SQLITE_OK ) {
   while( sqlite3_step( statement ) == SQLITE_ROW ) {
    // データが存在する場合は、配列に格納する
    Person *person = [[ Person alloc ] initWithStatement: statement database: database ];
    [ data addObject: person ];
    [ person release ];
   }
  }
  sqlite3_finalize( statement );
 } else {
  // DB ファイルオープン失敗
  sqlite3_close( database );
  NSLog( @"Failed to open databese with following message '%s'.", sqlite3_errmsg( database ));
  database = NULL;
 }
return database;
}


上記メソッド内に Person クラスとそのメソッドが確認できると思います。
名前から推察できる通り、データベースの person エンティティに対応するクラスです。
これは、CoreData を使う場合と違い、クラスおよびメソッドを自力で実装する必要があります。この辺りが現行バージョンで厄介な点です。

次回はこのクラスの概要と実装すべきメソッドを紹介します。
なお、sqlite3 という接頭辞がついた型または関数については、以前紹介したサイトなどを参考にしてください。(ここまでに出てきたものについては、非常によく使われていますのできちんと理解しておくことが求められます。)


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

Comment

Post comment

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

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/77-020a1fba

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


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


  • Ehara:
    ...


  • Hayate:
    ...


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


  • Ueda:
    ...



リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。