忍者ブログ

[PR]

2024年04月26日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

データベースのオープンと検索の基本

2008年11月22日
データベースのファイルが作れたら、まずそれを開きます。以下の例はKigenのソースを元に解りやすいように一部を書き換えたものです。何をやっているかというと、カテゴリリスト画面のUITableViewに表示するデータを格納する配列の作成です。ファイルを開いて、検索して、次の検索ができるように解放するところまでで、ファイルを閉じるところは含まれていません。ファイルはプログラム自体が終了するところで閉じるからです。

// lv1はカテゴリ1行ごとのデータ(下に出てくるNamaeというデータクラス)を格納する配列で、
// 本当はクラス内で宣言しています

NSMutableArray *lv1;
// databeseはデータベースのポインタで、これも本当はクラス内で宣言してます
sqlite3 *database;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mydatabase.sql"];
// mydatabase.sqlに自分で用意するデータベースファイル名を入れてください
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
// データベースファイルを開くことに成功しましたので、SQL文を構築します
// namaeというテーブルのデータでlevel2という列が-1になっている行から
// pkという列にあるデータ(重複不可能な行番号)を取り出します
const char *sql = "SELECT pk FROM namae WHERE level2=-1";
// SQL文を保持するポインタを作ります
sqlite3_stmt *statement;
// SQLで検索を実行する前準備です
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
// 準備が完了したので、実際に検索を実行します
// 検索条件に合う行があればSQLITE_ROWが返りループし続けます
while (sqlite3_step(statement) == SQLITE_ROW) {
// pkの値を変数primaryKeyに代入します。
int primaryKey = sqlite3_column_int(statement, 0);
// Namaeというデータクラスを記憶する場所を確保します
// 確保されたデータクラスは自身で行に含まれている残りのデータを取り出します
Namae *namae = [[Namae alloc] initWithPrimaryKey:primaryKey
database:database];
// 作成したNamaeクラスを配列に加えます
[lv1 addObject:namae];
// namaeという名前のポインタはもう不要なので解放します
[namae release];
} // ここまでが検索で該当する行がある限り繰り返されます
}
// 検索が終わったのでSQL文を解放します
sqlite3_finalize(statement);
} else {
// 何かエラーが起きた場合にはデータベースを閉じます
sqlite3_close(database);
NSAssert1(0, @"データベースのオープンに失敗 '%s'.", sqlite3_errmsg(database));
}
PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Trackback
トラックバックURL: