Rakontanto de ludo

Peace cannot be kept by force. It can only be achieved by understanding.

El Capitan + Xcode7 + iOS9 の開発環境で SQLite3 を使う

珍しくプログラミング回です。

以前に Ruby on Rails で家計簿を作ったのですが,Web から入れるのでいちいち mac を起動するのが面倒になってきたため,iPhone でアプリにすればいいやと思って今日作り始めました。AppStore を探せば秀逸な家計簿アプリはたくさんあるのですが,これまで使っていたデータをそのまま移行したいのと,個人的に入力にこだわりがあるので自分で好き勝手に作った方がいいやと思い,自作することに。

データベースを使う

Rails で作ったのが SQLite3 を使っていたので,そのファイルをそのまま Xcode で作ったプロジェクトに入れてアクセスすればいいや,と。仕事でも iOS の開発で Objective-C から SQLite3 を使っているので同じようにやればいいと思っていたら,自宅のは Xcode7 になっていてちょこっとハマりました。

FMDB を使って簡単 DB アクセス

仕事では素で SQLite3 へアクセスするコードを書いていますが,面倒なので FMDB というライブラリを使います。

github.com

GitHub で絶賛公開中。ソースを自分のところへ取り込めば OK です。ただし,fmdb.m だけはサンプルで不要です。とりあえずこんなコードを書いてみた。

    NSString *templatePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"development.sqlite3"];
    FMDatabase *db= [FMDatabase databaseWithPath:templatePath];
    NSString*   sql = @"select * from accounts where ymd = '20150618'";
    
    [db open];
    
    FMResultSet *results = [db executeQuery:sql];
    while ([results next]) {
            
        NSString *ymd       = [results stringForColumn:@"ymd"];
        NSString *time      = [results stringForColumn:@"time"];
        NSString *dayofweek = [results stringForColumn:@"dayofweek"];
        NSString *store     = [results stringForColumn:@"store"];
        NSString *category  = [results stringForColumn:@"category"];
        NSString *money     = [results stringForColumn:@"money"];
        
        NSLog(@"ymd       : [%@]", ymd);
        NSLog(@"time      : [%@]", time);
        NSLog(@"dayofweek : [%@]", dayofweek);
        NSLog(@"store     : [%@]", store);
        NSLog(@"category  : [%@]", category);
        NSLog(@"money     : [%@]", money);
    }
    
    [db close];

環境設定が従来と異なる

コードはいいんですが,Xcode で取り込むライブラリとかが変わっています。

f:id:tomohiko37_i:20151010160525p:plain

従来は Xcode の Build Phases にある Link Binary With Libraries に sqlite3.0.dylib というライブラリを取り込みますが,ありません。まずここでハマりました。調べてみたら,

forums.developer.apple.com

やっぱり同じことでハマっている人がいました。やり方としては,上記画面の Add Other... で /usr/lib を指定して libz.dylib を選べば OK です。そのあと,

f:id:tomohiko37_i:20151010161204p:plain

この太字のところ Other Linker Flags-lsqlite3 を設定します。これでコンパイルが通ります。

SQLite3 へアクセスできた

以上で SQLite3 に Objective-C からアクセスできました。あとは SQL をいじれば好きにデータが出し入れできるので家計簿開発も捗ることでしょう。