こんにちは!クラウドナインアップスのショウです!
前回の#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
1 2 3 4 5 |
#import "ViewController.h" #import "FMDatabase.h" @interface ViewController () @end |
データベースから取得した情報を格納するためにNSStringを用意しておくと良いでしょう!
1 2 3 4 5 6 7 8 9 |
@implementation ViewController { NSString *No; NSString *q; NSString *ans1; NSString *ans2; NSString *ans3; NSString *ans4; } |
今回はviewDidLoadに書きましたが、他にも色々とコードを書く場合には
1 2 3 |
-(void)database { // データベース作成・表示専用のメソッド } |
などの専用のメソッドを容易しておくといいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
- (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文ですが行を指定することもできます。
例えば、
1 |
NSString *selectSql = [NSString stringWithFormat:@"SELECT No,question,ans1,ans2,ans3,ans4 FROM quiz where ans2 = 30 "]; |
のように後ろにwhere句を付けることで
「 というテーブルの [ans2] の列の中で[30]というカラム値が含まれている行を取得」
ということになり実行(ビルド)すると
[ans2]の列の中で[30]というカラム値が含まれている4行目のデータが取得されました。
以上で終わりです \(^^)/
データベースを取り入れる事で、アプリ作成の幅が広がりますね。
途中でつまづいたり、さらにステップアップしたい方は
アプリ開発スクール「クラウドナインアップス」へお気軽にご相談ください。
アプリ開発スクール「クラウドナインアップス」へお気軽にご相談ください。
参考文献
参考にさせてもらいました。ありがとうございます。
crossover
http://ortk.main.jp/blog/?p=628
iPhone / Androidアプリ開発の簡単説明 -> DBの内容を表示させる具体的な方法
~ けんちんとん の10分で分かるアプリの作り方 ~
コメントをどうぞ