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

コメントを残す

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

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

CAPTCHA


ピックアップ記事

preg_match

2010年03月24日 過去Blog
自分用メモ $html = ブログから抜き出したソース; preg_match("/抜き出すパターン/", $html); 最初は正規表現が間違っているのかと思い、いくつか正規表現のパターンを変えてテストしてみましたが、手ごたえなし(´;ω;`)ウッ… 正規表現以外の問題だと思い、さらに基本的なことを調べてみると・・・ 「検索対象の文字列が1行か、複数行か。」 ここが問題だったようです…
「preg_match」をはてなブックマークに追加

UIActionSheet を複数使った場合のメソッドの振り分け

2011年05月03日 過去Blog
1つのクラスファイル内で、複数のUIActionSheetを使う時はtagプロパティを使って、どのアクションシートのボタンがクリックされたのかを判別します。 actionsheet.tag = 1; 詳しくは以下のサイトを参照。 http://technical-iphone.blogspot.com/2010/05/uiactionsheet.html
「UIActionSheet を複数使った場合のメソッドの振り分け」をはてなブックマークに追加

[UIColor] フォントの色を変えたい時

2010年12月13日 過去Blog
UIアイテムに表示させるフォントの色などの設定 self.TextLabel = [self newLabelWithPrimaryColor:[UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:1.0] selectedColor:[UIColor whiteColor] fontSize:14.0 bold:YES]; 上記のようにす…
「[UIColor] フォントの色を変えたい時」をはてなブックマークに追加

phpで処理を遅延させてから実行する。

2009年12月26日 過去Blog
phpで少し時間をおいてから処理を実行したい場合は、sleepを使います。 例) [php]<?php echo "最初の処理"; //3秒後に実行 sleep(3); //処理再開 echo "遅延後の処理"; ?>[/php]
「phpで処理を遅延させてから実行する。」をはてなブックマークに追加

iTunes Store の購入履歴とオーダー(注文)番号を表示する方法

2011年01月12日 過去Blog
iTunes Store の購入履歴とオーダー(注文)番号を表示する方法
iTunes Store の購入履歴とオーダー(注文)番号を表示する方法 iTunes がインストールされているコンピュータをお使いの場合は、こちら をクリックすると、 iTunes を起動して購入履歴を表示できます。Apple ID とパスワードの入力を求められます。 次の手順で iTunes Store および Mac App Store で購入したコンテンツのリストを表示することもできます。…
「iTunes Store の購入履歴とオーダー(注文)番号を表示する方法」をはてなブックマークに追加
© graffiti on the web . All rights reserved. WordPress Theme by comfy