スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CoreDataをRDBのように利用する Vol.1

CocoaでiPhoneアプリやMacアプリ開発をしている方なら一度は耳にする単語であるCoreData。これは主にSQLiteをラップし、データとビューのつなぎ合わせを簡潔にすることを目的としたフレームワークライブラリです。(MVCでいうところのModelに当たる)。加えて、Xcodeにおいて標準でCoreDataのエンティティ(テーブル)の作成やリレーションシップの作成をGUI上で行えるようになっているため、一見すると使いやすい印象を受けます。

ところが、現実的にこのライブラリをiPhoneアプリ開発で利用する方はあまり多くないようです。何故利用されないのかといえば、CoreDataにRDBと同じ機能を求めて利用しようとする方が多いからだと考えられます。CoreDataは前述のとおり、MVCでいうところのModelに当たる機能を担うため、ビューやコントローラとも密接に関係するように作られています。そのため、WebでいうところのHibernateやiBATIS(MyBATIS)、S2DAOといったO/Rマッピングツールとは異なり、データ単体での操作を目的としたライブラリとは少々違うものなのです。

そうなってしまうために「CoreDataなんか使えない!」となり、普通のSQLiteに走る方が多くなりがちなのです。とはいえ、Objective-Cで作られたSQLiteのO/Rマッピングツールで優れたものはまだ世に出ていないのとも事実です。FMDBという簡易的なSQLiteのラッパーライブラリは存在しますが、こちらは結局JavaでいうところのJDBCっぽい組み方が要求されるため、インピーダンスミスマッチが起こりうる可能性を抱えていますし、何よりソースコードにSQL文を記述するという時点で、普段からO/Rマッピングツールを利用している方から見れば扱いにくさを感じることも多いでしょう。

そうなると、Objective-CベースのO/Rマッピングツールをつくるしかないのか?という話になるのですが、少し待ってください。CoreDataは本当に使えないのでしょうか?そもそも、何故CoreDataは使えないという話になっているのでしょうか。その問題点さえ解決できれば、CoreDataも使えるようになる可能性があるかも知れません。

以下にCoreDataが使えない・使いにくいと言われる理由と考えられるものを挙げてみました。


01. Xcode上から初期レコードをデータベースに挿入することができない
SQLiteのよいところの1つとして、DBがファイル1つで表されているところにあります。そのため、予めレコードを追加しておき、そのファイルをコピーして利用すれば初期レコードをわざわざプログラム内で追加する必要がなくなります。SQLiteを利用している以上、CoreDataもそれが出来ないのかとおもいきや、そのように初期レコードを入れておくような仕組みはサポートされていません。ですので、結局プログラム内で初期レコードは追加する必要があります

02. 主キーや外部キーの概念がない
前述のとおり、CoreDataが目的としていることは、MVCでいうところのModelに当たります。そして、01でも記述したとおり予めレコードを追加しておくことを想定しておらず、そのアプリ上に限定してデータのCRUDが行われていることを想定しています。そのため、空っぽのDBに対してアプリ上でデータのCRUDを行う分に関しては扱いやすいのです。リレーションシップをXcode上で作成したとおりに勝手に行ってくれるばかりか、その関連先のエンティティ(NSManagedObjectクラスのインスタンスで、通常は管理オブジェクトと呼ぶ)のインスタンスも勝手に作成してくれるため、その点では非常に便利と言えます。では逆に、初期レコードを予め追加しておきたい場合はどうなのか?というと、ここで大きな問題が発生します。何故なら、主キーと外部キーの概念がないため、データの対応付けを自分で行うことが非常に難解になるからです。RDBでいうところのテーブル同士のリレーションシップには主キーと外部キーが必要です。その概念がないCoreDataに対して、どのように予めリレーションシップの存在する初期レコードを挿入することが出来るのでしょうか。まさかソースコードに1つ1つ記述していくわけには行きませんので、これは大きな課題となります

03. 追加した順番にデータを取得することが非常に面倒
主キーと外部キーがないということは、データのソートが追加順にできないことも示しています。CoreDataはソート条件を指定しないで取得した場合、追加した順番通りには取得できません。追加した順番にデータを取得したい場面は多いですよね。CoreDataでこれを行う場合、エンティティの属性に予め priority のような値属性を設けておき、順番に番号を振っておき、これを元にソートする・・・といった手段が考えられますが、CoreDataには主キーと外部キーの概念がないのと同時に、自動採番の仕組みもありません。自動採番をプログラム上で行っても、アプリを再起動したらメモリ上の自動採番用のIDはまた 0 から開始になりますので、その点からも重複を考慮し出すとどうすればいいんだ!という感じになってしまいます。(日付を利用するという手段も考えられますが、日付というのはいくらでも変更が出来るため、順番を保証する要素としては些か弱いです)

04. SQLでは1行で書ける集約関数がCoreDataだと20行くらい書かないといけない
これはもう大きな解説をするまでもない事実として紹介しておきます。SQLでいう集約関数(SUMやCOUNTといったもの)をCoreDataで扱うには、なんとソース上で20行くらい書かないといけません。データ処理を簡潔にしてソース量を減らせるのがCoreDataの売りじゃなかったのか・・・と少々疑問に感じる部分です。CoreDataは何もSQLiteだけがデータ保存先となるわけではないので、それを考えればそんなものかと考えられる節もありますが、それにしてもこの差は大きいです。



他にもまだまだあるかも知れませんが、
大きな理由としては上記の 4 つが挙げられるかと思います。

上記の問題を解決できれば確かにRDBのような使い方は出来るかと思います。とはいえ、本当に解決するだけの価値があるのかどうかが問題になりますね。結局SQLiteを直接使ったほうがいいんじゃないの?っていう疑問も当然あるかと思います。では次に、CoreDataの良い点を挙げてみます。


01. 空っぽのデータベースに対してデータをCRUDするときにリレーションも考慮してインスタンスを作成してくれる
これは前述でも紹介しましたが、CoreDataの良い点の1つです。主キー外部キーの概念がないため、その部分は勝手につなぎあわせてくれるというところです。

02. マイグレーションが簡単
アプリの機能拡張によって、データベースのスキーマが変更されることは多々あります。これをSQLiteで行う場合、非常に大変です。CoreDataでは予めバージョンごとのモデルデータを用意しておくことで、これを自動化してくれます。しかもXcode上でマイグレーションの設定が行えるので、非常に簡単です。これはSQLiteにはない優れた点ですね。

03. Key-value形式でデータを更新することが可能であり、またデータの変更に応じてコールバックを通知することが出来る
CoreDataではデータをKey-value形式で管理しているため、カラムのインデックスからデータを取得する生のSQLiteに比べるとデータが扱いやすいです。また、予めデリゲート先を指定しておくことで、データの追加や変更をコールバックとして通知することも可能です。この点もCoreDataの利点であると言えます。

04. エンティティに親子関係を作れる
これは簡単にいえば、クラスにおけるスーパークラスとサブクラスの関係と同じです。スーパークラスにあたるエンティティを親とすることで、同じ親を持ったエンティティはその親の属性を保持することが出来ます。例えば全てのエンティティに日付を持たせたい場合、各々のエンティティに日付属性を作成しなくても、親となる日付属性をもったエンティティを1つ作成し、これを継承することで全てのエンティティに日付属性を持たすことが可能になります。


以上代表的と思われる良い点を 4 つ挙げてみました。他にも、Xcodeがエンティティのクラスを自動生成してくれるところなどもあるかと思います。


この悪い点と良い点、2つを合わせて考えてみると、CoreDataにも他にはあまりない魅力的な機能が多いことがわかります。特にマイグレーションが簡単な点は大きいですし、Cocoa標準でサポートされている機能だけあって、同じくCocoa標準であるコントローラへの連携がし易い特徴もあります。

そこで、この悪い点を解決することを考えてみると、その殆どが主キーと外部キーがないことに起因するものであることがわかります。これを解決できれば、RDBのような扱い方をしつつもCoreDataを使うことも可能になると考えられます。


というわけで、次回は実際にどのようにコーディングすることで今回紹介した悪い点を解決することが出来るのか、という点についてご紹介していきます。
スポンサーサイト

テーマ : iPhone
ジャンル : 携帯電話・PHS

コメントの投稿

非公開コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
プロフィール

Kou

Author:Kou
モバイル関連の開発ばかりやってる人のブログです。たまにWebもやります。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。