MantleのFMDB用のラッパーライブラリがあったので軽く調べてみたメモ。
tanis2000/MTLFMDBAdapter
https://github.com/tanis2000/MTLFMDBAdapter
INSERT文
// The initial model we will write to the database
MTLFMDBMockUser *user = [[MTLFMDBMockUser alloc] init];
user.guid = @"myuniqueid";
user.name = @"John Doe";
user.age = [NSNumber numberWithInt:42];
// Create the INSERT statement
NSString *stmt = [MTLFMDBAdapter insertStatementForModel:user];
// Get the values of the record in a format we can use with FMDB
NSArray *params = [MTLFMDBAdapter columnValues:user];
// Execute our INSERT
[db executeUpdate:stmt withArgumentsInArray:params];
MTLFMDBAdapterクラスのinsertStatementForModel:メソッドでプロパティを文字列にしてinsert文用の文字列にし、バインドする値をMTLFMDBAdapter columnValues:メソッドで値をarrayにしてexecuteしている。
SELECT文
// Read the record we've just written to the database
NSError *error = nil;
FMResultSet *resultSet = [db executeQuery:@"select * from user"];
if ([resultSet next]) {
resultUser = [MTLFMDBAdapter modelOfClass:MTLFMDBMockUser.class fromFMResultSet:resultSet error:&error];
}
selectは単純にsql文を書く必要があるがclassを渡せばマッピングしてくれる。ただしNSSetで返る。
まとめ
メリット
- DictionaryとModelの変換のコードを書かなくていい
- SQL文を書かなくていいわけではない
- insert, update, deleteはSQLを書かなくていい
- selectはおそらくそのまま書いた方が早いからそうしているっぽい
- SQLとFMDBをわかった上でならその理屈は納得できる
- FMDBの使い方が指標になるので試行錯誤しなくていい
- - FMDBを使う初期開発時なら効率的かもしれない
デメリット
- Mantle自体使うと値を渡す部分が隠蔽化してしまう
- Mantle自体使うとエンティティがMTLModelを継承しなければいけない
- 初期開発でない場合に置き換えようとするとCRUD部分に手を加えることになる
参考URL
モデルクラスとNSDictionaryとの相互変換を楽に行えるようにするライブラリMantleを試す
http://safx-dev.blogspot.jp/2013/12/nsdictionarymantle.html