2010年12月09日 過去Blog
このチュートリアルでは、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

この投稿へのコメント

    1. aoi より:

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

    2. admin より:

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

    3. aoi より:

      @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. admin より:

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

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

    5. aoi より:

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

    6. admin より:

      @aoi さん
      動作したみたいで、良かったです (^_^)
      頑張ってください o(^-^)o

admin へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます。
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

CAPTCHA


ピックアップ記事

htmlソース内からメールアドレスを抽出

2010年05月20日 過去Blog
//mailto:が使用されているメールアドレス preg_match_all("/mailto:(.+?)"/s", $html2, $matches); //mailto:は使用されておらず、@を基準に判別 preg_match_all('/[-.w/]+@[-._[:lower:]d]+.[[:lower:]]{2,4}/s', $html2, $matches); …
「htmlソース内からメールアドレスを抽出」をはてなブックマークに追加

tableViewに関する覚え書き

2011年01月03日 過去Blog
tableView に関する設定の説明です。 テーブル内のセクション数を設定する 以下の例では、2つのセクションをもつテーブルになります。 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; } セクション内の行数を指定する 以下の例では、最初のセクションは、2行のデータを表示し、次のセクションでも2行のデータを表示します。…
「tableViewに関する覚え書き」をはてなブックマークに追加

PHP session 破棄

2010年06月11日 過去Blog
PHPでセッションを完全に破棄する <?php // セッション変数を全て解除する $_SESSION = array(); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 if (isset($_COOKIE[session_name()])) { setcookie(session_name(),…
「PHP session 破棄」をはてなブックマークに追加

[7.5] iPhoneアプリに背景画像を設置する

2010年12月06日 過去Blog
iPhoneアプリの背景に独自の画像をいれたい場合の説明です。デフォルトのままでも特に気にならない方も多いかもしれませんが、少し味気ないので、背景を設定してみましょう。 …
「[7.5] iPhoneアプリに背景画像を設置する」をはてなブックマークに追加

Drupal 7 のインストール

2011年04月22日 過去Blog
以下のインストール方法を参考にDrupal 7 のインストールに挑戦してみます。 Drupal 7 のインストール方法(英語) Step 1: ダウンロード 以下のサイトからダウンロードします。今回はzipファイルを選択。 latest version of Drupal 7. ダウンロードしたパッケージを解答し、FTPでサーバ上にまるごとアップします。 Step 2: データベース作成…
「Drupal 7 のインストール」をはてなブックマークに追加
© graffiti on the web . All rights reserved. WordPress Theme by comfy