Introduction to              CocoaSQLMapper                  Kenji Nishishiro                   @marvelph13年1月26日土曜日
CocoaSQLMapperとは?              Objective-CからSQLiteを利用するためのフレー              ムワークです。              JavaのiBATISの影響を受けています。13年1...
対象となる開発者              SQLiteのC API、あるいは FMDBのようなラッパ              ーライブラリを利用している開発者。              なぜCoreDataを使わないのか、説明が必要無  ...
サンプルテーブル                             key   name      age                             1      kenji    41   列に型は不要です        ...
モデルクラス                  @interface Person : NSObject                  @property (nonatomic) long long key;                ...
一行読み込み SMDatabase *database = [[SMDatabase alloc] initWithPath:path error:nil]; NSString *sql = @"SELECT * FROM Person WHE...
複数行読み込み   NSString *sql = @"SELECT * FROM Person";   NSArray *persons = [database selectArrayBySQL:sql parameter:nil   res...
集計        @interface Count : NSObject        @property (nonatomic) int value;        @end               NSString *sql = @"...
ここまでのまとめ              テーブルのデータをモデルに読み込む事が              できます。              テーブルのスキーマでは無く、SQLとマッピ              ングします。       ...
オープンソース              https://github.com/marvelph/CocoaSQLMapper13年1月26日土曜日
パラメータ                                 @interface Parameter : NSObject                                 @property (nonatomic...
挿入        Person *person = [[Person alloc] init];        person.name = @"setuna";        person.age = @11;        long lon...
更新              更新された行数が手に入るので、                 悲観的ロックなどにどうぞ          Person *person = [[Person alloc] init];          per...
削除         deleteBySQLというメソッドがありますが、               これは更新と一緒です13年1月26日土曜日
DDL              挿入・更新・削除以外のSQLには、        特別な値を返さないexecuteBySQLを用います13年1月26日土曜日
型のマッピング        int   long long   BOOL    float    double   NSNumber NSDate   NSString   NSData   nil        int     int64  ...
ヒント              nullを検索する時は、SQLにIS NULLと記述しな              くても、パラメータにnilを指定する事で実              現できます。              NSNumber...
ヒント              モデルにはゲッターとセッターでは無く、              本物のプロパティが必要です。              エラーの取得はオプションです。13年1月26日土曜日
ここまでのまとめ              挿入・更新・削除と操作別のメソッドがあ              ります。              扱えるプロパティの型には制限がありま              す。13年1月26日土曜日
行単位の処理               NSString *sql = @"SELECT * FROM Person";               [database selectWithBlock:^BOOL(Person *person...
トランザクション   transactionWithBlockに渡したブロック内の処理を、    トランザクジョンとして纏める事ができます       ブロックがNOを返すとロールバックします               サンプルを読んでくださ...
エラー処理    トランザクションブロック内側のエラーは、              パラメータに返してくださいトランザクション自体のエラーと一括処理できま                    す               サンプルを読んで...
マルチスレッド              SMDatabaseのインスタンスをスレッド毎に生              成してください。              デッドロック発生時のタイムアウトは未実              装です。13年...
実績              PoiCaのiOS版で1年以上実際に使用していま              す。http://poica.me/13年1月26日土曜日
設計              SQLを設定ファイルに分離する事は、可読性              を下げると考えています。              SQLのプリコンパイルは、メリットが少ない              と考えています。13...
構想              パラメータの為にクラスを定義する事が面              倒なので、NSDictionaryを使えるようにしたい              です。この場合、NSNullのサポートも必要か         ...
ありがとうございました13年1月26日土曜日
Upcoming SlideShare
Loading in …5
×

Introduction to cocoa sql mapper

1,527 views
1,489 views

Published on

第57回Cocoa勉強会発表資料。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,527
On SlideShare
0
From Embeds
0
Number of Embeds
800
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Introduction to cocoa sql mapper

  1. 1. Introduction to CocoaSQLMapper Kenji Nishishiro @marvelph13年1月26日土曜日
  2. 2. CocoaSQLMapperとは? Objective-CからSQLiteを利用するためのフレー ムワークです。 JavaのiBATISの影響を受けています。13年1月26日土曜日
  3. 3. 対象となる開発者 SQLiteのC API、あるいは FMDBのようなラッパ ーライブラリを利用している開発者。 なぜCoreDataを使わないのか、説明が必要無 い開発者。13年1月26日土曜日
  4. 4. サンプルテーブル key name age 1 kenji 41 列に型は不要です 2 yoshiko 41 3 izumi 17 keyはautoincrementです 4 sumika 1413年1月26日土曜日
  5. 5. モデルクラス @interface Person : NSObject @property (nonatomic) long long key; @property (nonatomic) NSString *name; @property (nonatomic) NSNumber *age; @end テーブルの列名とプロパティ名を えます13年1月26日土曜日
  6. 6. 一行読み込み SMDatabase *database = [[SMDatabase alloc] initWithPath:path error:nil]; NSString *sql = @"SELECT * FROM Person WHERE name = kenji"; Person *person = [database selectObjectBySQL:sql parameter:nil resultClass:[Person class] error:nil]; SQLとモデルのクラスを与えると、 インスタンスが得られます13年1月26日土曜日
  7. 7. 複数行読み込み NSString *sql = @"SELECT * FROM Person"; NSArray *persons = [database selectArrayBySQL:sql parameter:nil resultClass:[Person class] error:nil]; インスタンスの配列が、 NSArayで得られます13年1月26日土曜日
  8. 8. 集計 @interface Count : NSObject @property (nonatomic) int value; @end NSString *sql = @"SELECT COUNT(*) AS value FROM Person"; Count *count = [database selectObjectBySQL:sql parameter:nil resultClass: [Count class] error:nil]; 結果セットに、 AS句でプロパティ名を付けています13年1月26日土曜日
  9. 9. ここまでのまとめ テーブルのデータをモデルに読み込む事が できます。 テーブルのスキーマでは無く、SQLとマッピ ングします。 データの型はモデルから決定されます。13年1月26日土曜日
  10. 10. オープンソース https://github.com/marvelph/CocoaSQLMapper13年1月26日土曜日
  11. 11. パラメータ @interface Parameter : NSObject @property (nonatomic, strong) NSNumber *value1; @property (nonatomic, strong) NSNumber *value2; @end Parameter *parameter = [[Parameter alloc] init]; parameter.value1 = @10; parameter.value2 = @20; NSString *sql = @"SELECT * FROM Person WHERE :value1 <= age AND age <= :value2"; NSArray *persons = [database selectArrayBySQL:sql parameter:parameter resultClass: [Person class] error:nil]; バインド変数名をプロパティ名に合わせます13年1月26日土曜日
  12. 12. 挿入 Person *person = [[Person alloc] init]; person.name = @"setuna"; person.age = @11; long long int key = [database insertBySQL:@"INSERT INTO Person (name, age) VALUES(:name, :age)" parameter:person error:nil]; person.key = key; autoincrementされたkeyが手に入るので、 行の読み込みが不要です 後でupdateする時に必要ですよね?13年1月26日土曜日
  13. 13. 更新 更新された行数が手に入るので、 悲観的ロックなどにどうぞ Person *person = [[Person alloc] init]; person.key = 1; person.age = @31; int count = [database updateBySQL:@"UPDATE Person SET age = :age WHERE key = :key" parameter:person error:nil];13年1月26日土曜日
  14. 14. 削除 deleteBySQLというメソッドがありますが、 これは更新と一緒です13年1月26日土曜日
  15. 15. DDL 挿入・更新・削除以外のSQLには、 特別な値を返さないexecuteBySQLを用います13年1月26日土曜日
  16. 16. 型のマッピング int long long BOOL float double NSNumber NSDate NSString NSData nil int int64 int double double any double text bytes null NSNumberは中身次第です NSDateはエポックからの経過秒数です NSStringはUTF8として扱います13年1月26日土曜日
  17. 17. ヒント nullを検索する時は、SQLにIS NULLと記述しな くても、パラメータにnilを指定する事で実 現できます。 NSNumberは、数値プロパティがnilを許したい 時に用います。13年1月26日土曜日
  18. 18. ヒント モデルにはゲッターとセッターでは無く、 本物のプロパティが必要です。 エラーの取得はオプションです。13年1月26日土曜日
  19. 19. ここまでのまとめ 挿入・更新・削除と操作別のメソッドがあ ります。 扱えるプロパティの型には制限がありま す。13年1月26日土曜日
  20. 20. 行単位の処理 NSString *sql = @"SELECT * FROM Person"; [database selectWithBlock:^BOOL(Person *person, NSError *__autoreleasing *error) { return YES; } bySQL:sql parameter:nil resultClass:[Person class] error:nil]; 行単位でブロックが呼び出されます 結果行数が多い場合に、 NSArrayの生成を避ける事ができます ブロックがNOを返すと中断します13年1月26日土曜日
  21. 21. トランザクション transactionWithBlockに渡したブロック内の処理を、 トランザクジョンとして纏める事ができます ブロックがNOを返すとロールバックします サンプルを読んでください13年1月26日土曜日
  22. 22. エラー処理 トランザクションブロック内側のエラーは、 パラメータに返してくださいトランザクション自体のエラーと一括処理できま す サンプルを読んでください13年1月26日土曜日
  23. 23. マルチスレッド SMDatabaseのインスタンスをスレッド毎に生 成してください。 デッドロック発生時のタイムアウトは未実 装です。13年1月26日土曜日
  24. 24. 実績 PoiCaのiOS版で1年以上実際に使用していま す。http://poica.me/13年1月26日土曜日
  25. 25. 設計 SQLを設定ファイルに分離する事は、可読性 を下げると考えています。 SQLのプリコンパイルは、メリットが少ない と考えています。13年1月26日土曜日
  26. 26. 構想 パラメータの為にクラスを定義する事が面 倒なので、NSDictionaryを使えるようにしたい です。この場合、NSNullのサポートも必要か もしれません。 マルチスレッド利用時に、タイムアウトを サポートしたいです。13年1月26日土曜日
  27. 27. ありがとうございました13年1月26日土曜日

×