SQLiteのデータベースからデータを取り出す

このチュートリアルでは、SQLiteを使ったデータベースを外部で作成し、XCodeプロジェクトに読み込んで、データを取り出す方法を説明します。

サンプルとして、おみくじアプリを作成してみましょう。

ボタンを押すと結果が表示される単純なものです。SQLiteのデータを取り出すことを説明するのが趣旨ですので、効率的ではないかもしれませんが、分かりやすいように、データベース関連のメソッドなどは、すべて同じファイル内で処理します。

今回の流れ

  1. SQLiteデータベースを新規作成する
  2. 作成したデータベースをXCodeに取り込む
  3. iPhone上のインターフェースの作成
  4. 取り込んだデータベースからデータを取り出す

SQLiteデータベースを新規作成する

まず、SQLiteのデータベースを作成します。Macのターミナル上から作成する場合は、こちらの記事を参考にしてください。

簡単に作成する方法としては、GUIで操作出来るツールを利用する方法があります。

私が普段利用しているのは、The SQLite Sorcerer です。詳細は、リンク先の記事でご確認ください。

それでは、SQLiteデータベースを作成しますので、The SQLite Sorcerer を起動します。

上部の「Create」ボタンをクリックします。

760-1その後に開かれる「Create a new databaase」ダイアログ内のフォルダアイコンをクリックして、作成するデータベースの保存先およびデータベース名を設定します。

760-2今回は、デスクトップに「testDB.sqlite」という名前に設定しました。

760-3この際に、データベースの保存先の下にある「Key」は設定しないようにしてください。「Key」を設定してしまうと、設定したKeyを入力しないとデータベースが操作出来なくなってしまいます。

それでは「Create」ボタンを押して作成してください。

すると、指定した名前のデータベースが作成され、「tables」、「views」などのアイコンが表示されます。「tables」のアイコンを右クリックし、新規テーブルを作成します。「Name」、「Key」の入力が求められますので、Name には、「fortune」、Key には「pk」と入力し、Create します。

fortune とは運勢(おみくじ)という意味です。

pk はプライマリーキー(primary key)の略です。

ここまでで、以下のようになります。

760-4

右側に設定済のフィールドが表示されます。そのフィールドの上部にある「New Field」ボタンを押し、新しいフィールドを追加します。

フィールド表示部の下に新規フィールドの設定画面が現れますので、以下の画像のように設定し、右側にある緑のプラスアイコンをクリックして追加します。

760-5fortuneList – ここは、大吉、中吉 などおみくじの中身を登録するフィールドです。

同様にして、comment フィールドを追加してください。ここには、おみくじ結果に対するコメントを登録します。size は50にします。

フィールドの準備ができましたので、次は、レコードを登録していきましょう。

画面右上にある「Data」ボタンをクリックし(先ほどクリックしたFieldボタンの横)、「Add a record」ボタンを押します。私は以下の画像のように登録しましたが、詳細はお好きに設定してください。今回は3つだけ登録しました。

760-6

データベースの作成作業はこれで終了ですので、The SQLite Sorcerer を閉じます。

次は、XCodeを起動します。

新規プロジェクトから「View-based Application」を選択します。名前は「fortune」にして保存します。

760-7

作成したデータベースをXCodeに取り込む

プロジェクトが作成されたら、Resourceフォルダを右クリックし、既存のファイルを追加から、先ほど作成したデータベースをプロジェクトに読み込みます。その際、表示されるダイアログ内の「デスティネーション…」のチェックを入れて、追加してください。

iPhone上のインターフェースの作成

まず、Interface Builder を起動して、インターフェースを作成します。

XCode内のfortuneViewControllerxibファイルをダブルクリックして、Interface Builderが起動します。Interface Builder の使い方については、この辺で確認してください。

今回は以下の画像のようにラベル、ボタンをそれぞれ配置しました。以下のようにラベル3つとボタンを配置し、保存してください。

760-8

取り込んだデータベースからデータを取り出す

XCodeに戻ります。

まず、データベースの操作が出来るように、必要なライブラリを読み込みます。Frameworksフォルダを右クリックし、追加 > 既存のフレームワークをクリックします。動的ライブラリの中の「libsqlite3.0.dylib」をプロジェクトに追加します。

次に、fortuneViewController.h を編集します。

#import <UIKit/UIKit.h>

#import <sqlite3.h>

@interface fortuneViewController : UIViewController {

IBOutlet UILabel *fortuneResult;

IBOutlet UILabel *comment;

IBOutlet UILabel *navi;

}

@property(nonatomic,retain) IBOutlet UILabel *fortuneResult;

@property(nonatomic,retain) IBOutlet UILabel *comment;

@property(nonatomic,retain) IBOutlet UILabel *navi;

-(IBAction) submit:(id) sender;

@end

次に、fortuneViewController.m を編集します。

詳細については、コード内のコメントを参照してください。

#import “fortuneViewController.h”

@implementation fortuneViewController

@synthesize fortuneResult,comment,navi;

-(IBAction) submit:(id) sender{

//ボタンがクリックされると「今日の運勢は…」と表示されます

navi.text = @”今日の運勢は…”;

//ボタンのクリックから「0.5」秒後に結果が表示されます

[NSThread sleepForTimeInterval:0.5];

sqlite3* db;

NSString* work_path;

NSString* database_filename;

NSString* database_path;

NSString* template_path;

// データベース名をここでは “testDB.sqlite” とします。

database_filename = @”testDB.sqlite”;

// データベースファイルを格納するために文書フォルダーを取得します。

work_path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

// データベースファイルのパスを取得します。

database_path = [NSString stringWithFormat:@”%@/%@”, work_path, database_filename];

// 文書フォルダーにデータベースファイルが存在しているかを確認します。

NSFileManager* manager = [NSFileManager defaultManager];

if (![manager fileExistsAtPath:database_path])

{

NSError* error = nil;

// 文書フォルダーに存在しない場合は、データベースの複製元をバンドルから取得します。

template_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:database_filename];

// バンドルから取得したデータベースファイルを文書フォルダーにコピーします。

if (![manager copyItemAtPath:template_path toPath:database_path error:&error])

{

// データベースファイルのコピーに失敗した場合の処理です。

NSLog(@”DB読み込み失敗);

} else {

NSLog(@”DB読み込み成功);

}

}else {

NSLog(@”DB発見);

}

// 文書フォルダーに用意されたデータベースファイルを開きます。

if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK)

{

// データベースファイルを SQLite で開くことに成功しました。

NSLog(@”DBオープン成功:%d”,db);

}

sqlite3_stmt *statement;

//ランダムに結果を取り出すための設定です。

//0〜3の4つの数字がランダムに表示されます。

srand(time(nil));

int rnd = rand() % 4;

NSLog(@”%d”,rnd);

if(rnd == 0){

rnd = 2;

}

const char *sql = “SELECT fortuneList,comment FROM fortune WHERE pk = ?”;

// SQL 文をコンパイルします。

if (sqlite3_prepare_v2(db, sql, –1, &statement, NULL) != SQLITE_OK)

{

NSLog(@”error message ‘%s’.”, sqlite3_errmsg(db));

}else{

NSLog(@”SQLコンパイル成功);

// rnd の値が、上のSQL文の”?”に挿入されます。

sqlite3_bind_int(statement, 1, rnd);

sqlite3_step(statement);

//sqlite3_column_text(statement, 0) でfortuneList を取り出します。

fortuneResult.text = [NSString stringWithUTF8String🙁char *)sqlite3_column_text(statement, 0)];

//sqlite3_column_text(statement, 1) でcomment を取り出します。

comment.text = [NSString stringWithUTF8String🙁char *)sqlite3_column_text(statement, 1)];

//prepare済みSQLステートメントを廃棄します。

sqlite3_finalize(statement);

//データベースを閉じます。

sqlite3_close(db);

}

}

これでビルド&実行してみてください。以下の画像のようにおみくじの結果とコメントが表示されたら完成です。

760-9

少し、寂しいので、背景の画像を設定してみました。背景の設定方法はこちらでご確認ください。

760-10

投稿日:
カテゴリー: 過去Blog

7件のコメント

  1. こんにちは、iPhone開発初心者です。
    このチュートリアルどおりに作成してみたのですが、ビルドと実行がうまくいきません。
    データベースにアクセスしている
    navi.text = @”今日の運勢は…”;
    などで多くエラーが出ています。
    何か解決方法はありますでしょうか?
    アクセス権限などが必要なのでしょうか?
    よろしかったら回答をお願い致します。

  2. @aoi さん
    こんにちは。コメントありがとうございます。
    アクセス権限みたいなものは無いと思います。
    どのようなエラーが出ますか?
    少し前の記事なので、記事で省略していた部分があったかどうかも思い出せない状態ではありますが、Xcode上に表示されているエラー文章をいくつか書いていただけると、手がかりになるかもしれません。
    どうぞよろしくです (^_^)

  3. @admin さん
    こんにちは、返信ありがとうございます。
    navi.text = @”今日の運勢は…”; では、
    Expected expression before ‘@’ token
    Stray ‘342’ in program
    Stray ‘200’ in program
    Stray ‘235’ in program
    Stray ‘344’ in program
    Stray ‘273’ in program
    など28コのエラーが出ています。
    ほかにエラーが出ている箇所は、
    database_filename = @”testDB.sqlite”;
    NSLog(@”DB読み込み失敗“);
    NSLog(@”DB読み込み成功“);
    などです。
    データベースにうまくアクセスできていないように感じるのですが、解決方法がわかりません。
    回答をよろしくお願い致します。

  4. @aoi さん
    どうもです。「Stray〜」のエラーは多分、記事をそのままコピペされた時に、”(ダブルクォート)が全角に変換されているか、全角スペースか何かが入ってるんだと思います。

    NSLog(@”DB読み込み失敗“); ←これなんかも「”」が「“」に変換されてしまっているように思います。
    この辺はもしかしたらワードプレス側の出力の問題なのかもしれませんが (^_^;A
    お手数ですが、全角文字が含まれていないか一度確認をお願いします。

  5. @admin さん
    こんにちは、返信ありがとうございます。
    変換してみると、ビルド&実行できました!
    ご指摘、ありがとうございました。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です