ハチマン | 八幡山と育児、ライフスタイル、ITの情報ブログ

データベースを作ってiOSアプリに組み込んでみた ~#2

データベースを作ってiOSアプリに組み込んでみた ~#2

こんにちは!クラウドナインアップスのショウです!

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

スクリーンショット 2015-05-07 13.06.28

更に、[TARGETS] -> [Build Phases] -> [Link Binary With Libraries] から
libsqlite3.0.dylib をプロジェクトに追加します。
スクリーンショット 2015-05-07 13.25.13
そして前回作成したデータベースを使うので
作成したデータベースをプロジェクトにコピーして追加してください。
fmdb_screenshot
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文の条件式にすることで、すべての行が終わるまでループ処理されます。

実行(ビルド)するとこんな風に表示されます。
fmdb_screenshot2
ちなみに…
(4)のSELECT文ですが行を指定することもできます。
例えば、
NSString *selectSql = [NSString stringWithFormat:@"SELECT No,question,ans1,ans2,ans3,ans4 FROM quiz where ans2 = 30 "];

のように後ろにwhere句を付けることで
「[quiz] というテーブルの [ans2] の列の中で[30]というカラム値が含まれている行を取得」
ということになり実行(ビルド)すると

fmdb_scshot_3
[ans2]の列の中で[30]というカラム値が含まれている4行目のデータが取得されました。
以上で終わりです \(^^)/
データベースを取り入れる事で、アプリ作成の幅が広がりますね。
途中でつまづいたり、さらにステップアップしたい方は
アプリ開発スクール「クラウドナインアップス」へお気軽にご相談ください。
スクリーンショット 2015-03-09 11.28.56

参考文献

参考にさせてもらいました。ありがとうございます。
crossover
http://ortk.main.jp/blog/?p=628
iPhone / Androidアプリ開発の簡単説明 -> DBの内容を表示させる具体的な方法
~ けんちんとん の10分で分かるアプリの作り方 ~
ハチマンブログは今なん位? 関東情報ブログランキング
【DMM FX】入金

コメントをどうぞ

*
*
* (公開されません)

世田谷区八幡山から育児ライフスタイルITに関する情報をブログでお届けします。
サイトマップ
Return Top