- SQLiteデータベースを新規作成する
- 作成したデータベースをXCodeに取り込む
- iPhone上のインターフェースの作成
- 取り込んだデータベースからデータを取り出す
目次
SQLiteデータベースを新規作成する
まず、SQLiteのデータベースを作成します。Macのターミナル上から作成する場合は、こちらの記事を参考にしてください。 簡単に作成する方法としては、GUIで操作出来るツールを利用する方法があります。 私が普段利用しているのは、The SQLite Sorcerer です。詳細は、リンク先の記事でご確認ください。 それでは、SQLiteデータベースを作成しますので、The SQLite Sorcerer を起動します。 上部の「Create」ボタンをクリックします。





作成したデータベースをXCodeに取り込む
プロジェクトが作成されたら、Resourceフォルダを右クリックし、既存のファイルを追加から、先ほど作成したデータベースをプロジェクトに読み込みます。その際、表示されるダイアログ内の「デスティネーション…」のチェックを入れて、追加してください。iPhone上のインターフェースの作成
まず、Interface Builder を起動して、インターフェースを作成します。 XCode内のfortuneViewControllerxibファイルをダブルクリックして、Interface Builderが起動します。Interface Builder の使い方については、この辺で確認してください。 今回は以下の画像のようにラベル、ボタンをそれぞれ配置しました。以下のようにラベル3つとボタンを配置し、保存してください。
取り込んだデータベースからデータを取り出す
XCodeに戻ります。 まず、データベースの操作が出来るように、必要なライブラリを読み込みます。Frameworksフォルダを右クリックし、追加 > 既存のフレームワークをクリックします。動的ライブラリの中の「libsqlite3.0.dylib」をプロジェクトに追加します。 次に、fortuneViewController.h を編集します。次に、fortuneViewController.m を編集します。 詳細については、コード内のコメントを参照してください。#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
これでビルド&実行してみてください。以下の画像のようにおみくじの結果とコメントが表示されたら完成です。#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);
}
}


こんにちは、iPhone開発初心者です。
このチュートリアルどおりに作成してみたのですが、ビルドと実行がうまくいきません。
データベースにアクセスしている
navi.text = @”今日の運勢は…”;
などで多くエラーが出ています。
何か解決方法はありますでしょうか?
アクセス権限などが必要なのでしょうか?
よろしかったら回答をお願い致します。
@aoi さん
こんにちは。コメントありがとうございます。
アクセス権限みたいなものは無いと思います。
どのようなエラーが出ますか?
少し前の記事なので、記事で省略していた部分があったかどうかも思い出せない状態ではありますが、Xcode上に表示されているエラー文章をいくつか書いていただけると、手がかりになるかもしれません。
どうぞよろしくです (^_^)
@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読み込み成功“);
などです。
データベースにうまくアクセスできていないように感じるのですが、解決方法がわかりません。
回答をよろしくお願い致します。
@aoi さん
どうもです。「Stray〜」のエラーは多分、記事をそのままコピペされた時に、”(ダブルクォート)が全角に変換されているか、全角スペースか何かが入ってるんだと思います。
NSLog(@”DB読み込み失敗“); ←これなんかも「”」が「“」に変換されてしまっているように思います。
この辺はもしかしたらワードプレス側の出力の問題なのかもしれませんが (^_^;A
お手数ですが、全角文字が含まれていないか一度確認をお願いします。
@admin さん
こんにちは、返信ありがとうございます。
変換してみると、ビルド&実行できました!
ご指摘、ありがとうございました。
@aoi さん
動作したみたいで、良かったです (^_^)
頑張ってください o(^-^)o