こんにちは!クラウドナインアップスのショウです!
前回の#1ではターミナルでデータベースを作成し、Litaで確認しました。
今回はそのデータベースをXcodeに組み込んでデバックエリアに表示させてみたい思います。
FMDBをセット
SQLiteをiOSで扱いやすくしてくれるFMDBというライブラリを使います。
FMDBはGitHubからファイルをダウンロードして下さい。
zipを解凍して
[fmdb-master / src / fmdbフォルダ]の中に
あるファイル群をXcodeに追加します。

更に、[TARGETS] -> [Build Phases] -> [Link Binary With Libraries] から
libsqlite3.0.dylib をプロジェクトに追加します。

そして前回作成したデータベースを使うので
作成したデータベースをプロジェクトにコピーして追加してください。

FMDBを使う
ここからはソースコードを書いていきます。
FMDBを使いたいところにFMDatabase.hをインポートしてください。
ViewController.m
#import "ViewController.h" #import "FMDatabase.h" @interface ViewController () @end
データベースから取得した情報を格納するためにNSStringを用意しておくと良いでしょう!
@implementation ViewController
{
NSString *No;
NSString *q;
NSString *ans1;
NSString *ans2;
NSString *ans3;
NSString *ans4;
}
今回はviewDidLoadに書きましたが、他にも色々とコードを書く場合には
-(void)database {
// データベース作成・表示専用のメソッド
}
などの専用のメソッドを容易しておくといいと思います。
- (void)viewDidLoad {
[super viewDidLoad];
// (1)
NSString *dbfile = @"hachiman.db";
// データベースファイルを格納するために文書フォルダを取得
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:dbfile];
NSLog(@"db path = %@", dbPath);
// (2)
BOOL checkDb;
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
checkDb = [fileManager fileExistsAtPath:dbPath];// データベースファイルを確認
if(!checkDb){
// ファイルが無い場合はコピー
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbfile];
checkDb = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if(!checkDb){
// Erroの場合
NSLog(@"Copy error = %@", defaultDBPath);
}
} else {
NSLog(@"DB file OK");
}
// (3)
//データベースのパス
FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
// (4)
//データベース内のテーブルから表示したいカラムを選ぶ
NSString *selectSql = [NSString stringWithFormat:@"SELECT No,question,ans1,ans2,ans3,ans4 FROM quiz "];
[db open];
// (5)
FMResultSet *result = [db executeQuery:selectSql];
while ([result next]) {
No = [result stringForColumn:@"No"];
q = [result stringForColumn:@"question"];
ans1 = [result stringForColumn:@"ans1"];
ans2 = [result stringForColumn:@"ans2"];
ans3 = [result stringForColumn:@"ans3"];
ans4 = [result stringForColumn:@"ans4"];
NSLog(@"%@,%@,%@,%@,%@,%@", No, q, ans1, ans2, ans3, ans4);
}
[db close];
}
(1) データベースを作成するためのパスとファイル名を取得します。
(2) 指定されたデータベースがちゃんとあるか確認し、無ければコピーしますが今回はデータベースをプロジェクトにコピーして追加しているのでエラーになることは無いと思います。
(3) FMDBのクラスのインスタンスを作成します。
(4) SELECT文を使い、データベースから取得したいデータ(カラム)を選択します。データを取得するには どのテーブルの、どのカラムの値を取得するのかを指定します。
(5) FMResultSet – next を呼ぶことで、取得された行が順に選択されます。行が存在すればYES、無ければNOが返されるので、これをwhile文の条件式にすることで、すべての行が終わるまでループ処理されます。
実行(ビルド)するとこんな風に表示されます。

ちなみに…
(4)のSELECT文ですが行を指定することもできます。
例えば、
NSString *selectSql = [NSString stringWithFormat:@"SELECT No,question,ans1,ans2,ans3,ans4 FROM quiz where ans2 = 30 "];
のように後ろにwhere句を付けることで
「[quiz] というテーブルの [ans2] の列の中で[30]というカラム値が含まれている行を取得」
ということになり実行(ビルド)すると

[ans2]の列の中で[30]というカラム値が含まれている4行目のデータが取得されました。
以上で終わりです \(^^)/
データベースを取り入れる事で、アプリ作成の幅が広がりますね。
途中でつまづいたり、さらにステップアップしたい方は
アプリ開発スクール「クラウドナインアップス」へお気軽にご相談ください。
アプリ開発スクール「クラウドナインアップス」へお気軽にご相談ください。
参考文献
参考にさせてもらいました。ありがとうございます。
crossover
http://ortk.main.jp/blog/?p=628
iPhone / Androidアプリ開発の簡単説明 -> DBの内容を表示させる具体的な方法
~ けんちんとん の10分で分かるアプリの作り方 ~









コメントをどうぞ