SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
Introduction to
              CocoaSQLMapper
                  Kenji Nishishiro
                   @marvelph




13年1月26日土曜日
CocoaSQLMapperとは?

              Objective-CからSQLiteを利用するためのフレー
              ムワークです。

              JavaのiBATISの影響を受けています。



13年1月26日土曜日
対象となる開発者

              SQLiteのC API、あるいは FMDBのようなラッパ
              ーライブラリを利用している開発者。

              なぜCoreDataを使わないのか、説明が必要無
              い開発者。


13年1月26日土曜日
サンプルテーブル

                             key   name      age

                             1      kenji    41
   列に型は不要です                  2     yoshiko   41

                             3     izumi     17

       keyはautoincrementです   4     sumika    14


13年1月26日土曜日
モデルクラス

                  @interface Person : NSObject

                  @property (nonatomic) long long key;
                  @property (nonatomic) NSString *name;
                  @property (nonatomic) NSNumber *age;

                  @end




    テーブルの列名とプロパティ名を                        えます


13年1月26日土曜日
一行読み込み

 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日土曜日
複数行読み込み
   NSString *sql = @"SELECT * FROM Person";
   NSArray *persons = [database selectArrayBySQL:sql parameter:nil
   resultClass:[Person class] error:nil];




                                  インスタンスの配列が、
                                        NSArayで得られます


13年1月26日土曜日
集計
        @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日土曜日
ここまでのまとめ
              テーブルのデータをモデルに読み込む事が
              できます。

              テーブルのスキーマでは無く、SQLとマッピ
              ングします。

              データの型はモデルから決定されます。

13年1月26日土曜日
オープンソース


              https://github.com/marvelph/CocoaSQLMapper




13年1月26日土曜日
パラメータ
                                 @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日土曜日
挿入
        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日土曜日
更新
              更新された行数が手に入るので、
                 悲観的ロックなどにどうぞ

          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日土曜日
削除


         deleteBySQLというメソッドがありますが、
               これは更新と一緒です




13年1月26日土曜日
DDL


              挿入・更新・削除以外のSQLには、
        特別な値を返さないexecuteBySQLを用います




13年1月26日土曜日
型のマッピング
        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日土曜日
ヒント
              nullを検索する時は、SQLにIS NULLと記述しな
              くても、パラメータにnilを指定する事で実
              現できます。

              NSNumberは、数値プロパティがnilを許したい
              時に用います。

13年1月26日土曜日
ヒント

              モデルにはゲッターとセッターでは無く、
              本物のプロパティが必要です。

              エラーの取得はオプションです。



13年1月26日土曜日
ここまでのまとめ

              挿入・更新・削除と操作別のメソッドがあ
              ります。

              扱えるプロパティの型には制限がありま
              す。


13年1月26日土曜日
行単位の処理
               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日土曜日
トランザクション

   transactionWithBlockに渡したブロック内の処理を、
    トランザクジョンとして纏める事ができます
       ブロックがNOを返すとロールバックします
               サンプルを読んでください


13年1月26日土曜日
エラー処理

    トランザクションブロック内側のエラーは、
              パラメータに返してください
トランザクション自体のエラーと一括処理できま
                    す
               サンプルを読んでください


13年1月26日土曜日
マルチスレッド

              SMDatabaseのインスタンスをスレッド毎に生
              成してください。

              デッドロック発生時のタイムアウトは未実
              装です。


13年1月26日土曜日
実績


              PoiCaのiOS版で1年以上実際に使用していま
              す。http://poica.me/




13年1月26日土曜日
設計

              SQLを設定ファイルに分離する事は、可読性
              を下げると考えています。

              SQLのプリコンパイルは、メリットが少ない
              と考えています。


13年1月26日土曜日
構想
              パラメータの為にクラスを定義する事が面
              倒なので、NSDictionaryを使えるようにしたい
              です。この場合、NSNullのサポートも必要か
              もしれません。

              マルチスレッド利用時に、タイムアウトを
              サポートしたいです。
13年1月26日土曜日
ありがとうございました




13年1月26日土曜日

Contenu connexe

En vedette

PoiCa Sensorの組み込み
PoiCa Sensorの組み込みPoiCa Sensorの組み込み
PoiCa Sensorの組み込みmavelph
 
PostgreSQL 9.5 - Major Features
PostgreSQL 9.5 - Major FeaturesPostgreSQL 9.5 - Major Features
PostgreSQL 9.5 - Major FeaturesInMobi Technology
 
Building Spark as Service in Cloud
Building Spark as Service in CloudBuilding Spark as Service in Cloud
Building Spark as Service in CloudInMobi Technology
 
Building Machine Learning Pipelines
Building Machine Learning PipelinesBuilding Machine Learning Pipelines
Building Machine Learning PipelinesInMobi Technology
 
8 Ways a Digital Media Platform is More Powerful than “Marketing”
8 Ways a Digital Media Platform is More Powerful than “Marketing”8 Ways a Digital Media Platform is More Powerful than “Marketing”
8 Ways a Digital Media Platform is More Powerful than “Marketing”New Rainmaker
 
How Often Should You Post to Facebook and Twitter
How Often Should You Post to Facebook and TwitterHow Often Should You Post to Facebook and Twitter
How Often Should You Post to Facebook and TwitterBuffer
 
Why Content Marketing Fails
Why Content Marketing FailsWhy Content Marketing Fails
Why Content Marketing FailsRand Fishkin
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great InfographicsSlideShare
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShareKapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareEmpowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation OptimizationOneupweb
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingContent Marketing Institute
 
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...SlideShare
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShareSlideShare
 

En vedette (20)

PoiCa Sensorの組み込み
PoiCa Sensorの組み込みPoiCa Sensorの組み込み
PoiCa Sensorの組み込み
 
Attacking Web Proxies
Attacking Web ProxiesAttacking Web Proxies
Attacking Web Proxies
 
Optimizer Hints
Optimizer HintsOptimizer Hints
Optimizer Hints
 
PostgreSQL 9.5 - Major Features
PostgreSQL 9.5 - Major FeaturesPostgreSQL 9.5 - Major Features
PostgreSQL 9.5 - Major Features
 
Building Spark as Service in Cloud
Building Spark as Service in CloudBuilding Spark as Service in Cloud
Building Spark as Service in Cloud
 
Building Machine Learning Pipelines
Building Machine Learning PipelinesBuilding Machine Learning Pipelines
Building Machine Learning Pipelines
 
Case Studies on PostgreSQL
Case Studies on PostgreSQLCase Studies on PostgreSQL
Case Studies on PostgreSQL
 
Cloud Computing (CCSME 2015 talk) - mypapit
Cloud Computing (CCSME 2015 talk) - mypapitCloud Computing (CCSME 2015 talk) - mypapit
Cloud Computing (CCSME 2015 talk) - mypapit
 
8 Ways a Digital Media Platform is More Powerful than “Marketing”
8 Ways a Digital Media Platform is More Powerful than “Marketing”8 Ways a Digital Media Platform is More Powerful than “Marketing”
8 Ways a Digital Media Platform is More Powerful than “Marketing”
 
How Often Should You Post to Facebook and Twitter
How Often Should You Post to Facebook and TwitterHow Often Should You Post to Facebook and Twitter
How Often Should You Post to Facebook and Twitter
 
Slides That Rock
Slides That RockSlides That Rock
Slides That Rock
 
Why Content Marketing Fails
Why Content Marketing FailsWhy Content Marketing Fails
Why Content Marketing Fails
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great Infographics
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
 
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare
 

Similaire à Introduction to cocoa sql mapper

SQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしようSQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしようA AOKI
 
Scala.jsプロジェクト作成まで
Scala.jsプロジェクト作成までScala.jsプロジェクト作成まで
Scala.jsプロジェクト作成までTomohiro Suwa
 
Google Gears データベースの基礎
Google Gears データベースの基礎Google Gears データベースの基礎
Google Gears データベースの基礎webos-goodies
 
大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発についてYuki Tanaka
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろTakuya Tsuchida
 
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるスケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるYusaku Watanabe
 
Nds meetup8 lt
Nds meetup8 ltNds meetup8 lt
Nds meetup8 ltushiboy
 
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scalaめんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scalaKazuhiro Sera
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5Toshi Harada
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)Ryuichi ITO
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
JDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングJDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングGo Hayakawa
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseToshi Harada
 
データベースシステム論06 - SQL基礎演習1 データの定義と操作
データベースシステム論06 - SQL基礎演習1 データの定義と操作データベースシステム論06 - SQL基礎演習1 データの定義と操作
データベースシステム論06 - SQL基礎演習1 データの定義と操作Shohei Yokoyama
 

Similaire à Introduction to cocoa sql mapper (17)

SQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしようSQL Serverの関数を一覧でマスターしよう
SQL Serverの関数を一覧でマスターしよう
 
Scala.jsプロジェクト作成まで
Scala.jsプロジェクト作成までScala.jsプロジェクト作成まで
Scala.jsプロジェクト作成まで
 
Tdd
TddTdd
Tdd
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
Google Gears データベースの基礎
Google Gears データベースの基礎Google Gears データベースの基礎
Google Gears データベースの基礎
 
大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発について
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろ
 
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるスケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考える
 
Nds meetup8 lt
Nds meetup8 ltNds meetup8 lt
Nds meetup8 lt
 
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scalaめんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
JDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングJDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミング
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-database
 
データベースシステム論06 - SQL基礎演習1 データの定義と操作
データベースシステム論06 - SQL基礎演習1 データの定義と操作データベースシステム論06 - SQL基礎演習1 データの定義と操作
データベースシステム論06 - SQL基礎演習1 データの定義と操作
 

Dernier

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Dernier (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

Introduction to cocoa sql mapper

  • 1. Introduction to CocoaSQLMapper Kenji Nishishiro @marvelph 13年1月26日土曜日
  • 2. CocoaSQLMapperとは? Objective-CからSQLiteを利用するためのフレー ムワークです。 JavaのiBATISの影響を受けています。 13年1月26日土曜日
  • 3. 対象となる開発者 SQLiteのC API、あるいは FMDBのようなラッパ ーライブラリを利用している開発者。 なぜCoreDataを使わないのか、説明が必要無 い開発者。 13年1月26日土曜日
  • 4. サンプルテーブル key name age 1 kenji 41 列に型は不要です 2 yoshiko 41 3 izumi 17 keyはautoincrementです 4 sumika 14 13年1月26日土曜日
  • 5. モデルクラス @interface Person : NSObject @property (nonatomic) long long key; @property (nonatomic) NSString *name; @property (nonatomic) NSNumber *age; @end テーブルの列名とプロパティ名を えます 13年1月26日土曜日
  • 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. 複数行読み込み NSString *sql = @"SELECT * FROM Person"; NSArray *persons = [database selectArrayBySQL:sql parameter:nil resultClass:[Person class] error:nil]; インスタンスの配列が、 NSArayで得られます 13年1月26日土曜日
  • 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. ここまでのまとめ テーブルのデータをモデルに読み込む事が できます。 テーブルのスキーマでは無く、SQLとマッピ ングします。 データの型はモデルから決定されます。 13年1月26日土曜日
  • 10. オープンソース https://github.com/marvelph/CocoaSQLMapper 13年1月26日土曜日
  • 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. 挿入 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. 更新 更新された行数が手に入るので、 悲観的ロックなどにどうぞ 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. 削除 deleteBySQLというメソッドがありますが、 これは更新と一緒です 13年1月26日土曜日
  • 15. DDL 挿入・更新・削除以外のSQLには、 特別な値を返さないexecuteBySQLを用います 13年1月26日土曜日
  • 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. ヒント nullを検索する時は、SQLにIS NULLと記述しな くても、パラメータにnilを指定する事で実 現できます。 NSNumberは、数値プロパティがnilを許したい 時に用います。 13年1月26日土曜日
  • 18. ヒント モデルにはゲッターとセッターでは無く、 本物のプロパティが必要です。 エラーの取得はオプションです。 13年1月26日土曜日
  • 19. ここまでのまとめ 挿入・更新・削除と操作別のメソッドがあ ります。 扱えるプロパティの型には制限がありま す。 13年1月26日土曜日
  • 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. トランザクション transactionWithBlockに渡したブロック内の処理を、 トランザクジョンとして纏める事ができます ブロックがNOを返すとロールバックします サンプルを読んでください 13年1月26日土曜日
  • 22. エラー処理 トランザクションブロック内側のエラーは、 パラメータに返してください トランザクション自体のエラーと一括処理できま す サンプルを読んでください 13年1月26日土曜日
  • 23. マルチスレッド SMDatabaseのインスタンスをスレッド毎に生 成してください。 デッドロック発生時のタイムアウトは未実 装です。 13年1月26日土曜日
  • 24. 実績 PoiCaのiOS版で1年以上実際に使用していま す。http://poica.me/ 13年1月26日土曜日
  • 25. 設計 SQLを設定ファイルに分離する事は、可読性 を下げると考えています。 SQLのプリコンパイルは、メリットが少ない と考えています。 13年1月26日土曜日
  • 26. 構想 パラメータの為にクラスを定義する事が面 倒なので、NSDictionaryを使えるようにしたい です。この場合、NSNullのサポートも必要か もしれません。 マルチスレッド利用時に、タイムアウトを サポートしたいです。 13年1月26日土曜日