sqliteを使う必要があったので、CoreDataとFMDBのどっちがいいんだろうと思って調べてみた。結論としては、FMDB使ったほうが楽だと思います。CoreDataだるい。
全く新しいデータベースを用意して利用する場合には便利かもと思ったが、正直かなり使いにくかった。sqlite側にCoreDataの規約を与える必要があって、その作業がバカバカしくなった。
CoreDataを使う場合のトラブルシュート - haoyayoi Dev Style - iPhoneアプリ開発グループにあるように、sqliteで既存のデータを与えておきたい場合はとてもめんどくさい。カラムとテーブルに大きな変更が必要になる。
ORマッパーを使うのになんでこっちがお前の規約に合わせなきゃならんのだ、そういうのはモデル側で吸収するのがあるべき姿じゃないのか・・・と首を傾げた。CoreDataを使うメリットがあまり無かった。
結局1日強を費やして、CoreData使うのはめんどいし大きなメリットも無いから辞めることにした。
で、今ではこっち使ってる。
gitHubに最新のソースがあります。
このサンプルプロジェクトのfmdb.mにだいたいの使い方が書いてあるし、sqliteのライブラリの薄いラッパーなのでコード量も多くない。追いかけるのも楽。それに何しろ、すぐ使えたw
sqliteファイルをプロジェクトに追加して、このコードを実行すればdbオブジェクトが初期化されCRUDが可能になります。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sqliteのファイル名"]; db= [FMDatabase databaseWithPath:writableDBPath];
デバッグ情報を出したい時は、
[db setTraceExecution:YES];
ただ、コード読めば分かるんだろうけど、FMDataBaseの初期化処理=sqliteファイルを読み込むのを毎回行わなくてはならないという問題がある。viewDidLoadで初期化してreleaseしなければ接続情報もキャッシュされるだろうと思っていたら、メソッドを跨いだらアウトだった。
既存のデータベースを使う場合はFMDBのほうが楽です。CoreDataを使うべき理由は正直分かりませんでした。