前回エントリから早2週間が経ってしまいました(^^;。
さて2週間の間何をやっていたかといいますと、実は「Core Data」の勉強です。これはこれから作ろうと思っているプログラム内でデータの保存を行う必要があるので、避けては通れない部分・・・なのですが、結果相当ハマりました。
◎RDBMSとの違いに悩む
そもそも「Core Dataって、ネット上にいろんなチュートリアルもあるのにどこが難しいの?」となる訳ですが、一言で書くとRDBMSのとの違いが分からない・・・つまり、RDBMSの概念とCore Dataの概念とを比較させた場合、どの部分がどこに該当するのかが分からなかったのです。
RDBMSを使った開発の場合だと、最初にDBとの接続情報を保持するConnectionオブジェクトがあって、その下にテーブルを保持するRecordsetオブジェクトがあります。テーブルを取得する際は抽出条件(SQL)を引数としてOpenメソッドを使って検索結果を取得します。また、挿入、更新、削除といった処理は、やはりSQLを引数としてExcuteメソッドを呼びます。・・・というのが、言語、ミドルウェア、RDBMSの種類に問わず大体共通した使い方だと思います。
[RDBMSに対するデータベースアクセス]
Connectionオブジェクト:DBとの接続情報を保持する。DBのIPアドレスやらDBのインスタンス名を設定してConnectionを確立する
Recordsetオブジェクト:検索結果テーブルを保持する。検索結果テーブルは列と行で構成される
Openメソッド:テーブル名や”SELECT~”で始まるSQL文を引数として呼び出す。検索結果としてRecordsetオブジェクトが返ってくる
Executeメソッド:挿入(INSERT)、更新(UPDATE)、削除(DELETE)を行うSQL文を実行する
Begin、Commit、Rollback:INSERT/UPDATE/DELETEを行う際、データベースの整合性を保つ為のトランザクション処理
※言語、ミドルウェア、RDBMSによっては名称や方法が異なりますがだいたい同じです。(ものすごい大雑把なまとめ方ですけど。)
Core Dataの場合もバックエンドはSQLiteというデータベースを使います。このデータベースにアクセスする為のフレームワークがCore Dataですが、上記のデータベースアクセス手法とは異なります。
[RDBMSに対するデータベースアクセスとCore Dataの比較]
Connectionオブジェクト→Core Dataが呼び出すSQLiteはアプリケーション組み込み型のデータベースの為、「Connectionを確立する」という概念はおそらくありません。ただし、フレームワークの上位にあって、データの抽出や挿入/削除を行うという意味ではNSManagedObjectContextオブジェクトが該当します。
Recordsetオブジェクト→NSFetchRequestオブジェクト。検索結果となるNSManagedObject(またはそのサブクラス)を保持する。
Openメソッド→NSManagedObjectContext executeFetchRequestメソッド。(NSFetchedResultsControllerを使用した場合は、performFetchメソッドを使う。)
Executeメソッド→INSERT/DELETEはそれぞれNSManagedObjectContext InsertObject/DeleteObject。UPDATEの場合は検索結果となるNSManagedObjectの値を直接書き換える。
Begin、Commit、Rollback → NSManagedObjectへの挿入、更新、削除を反映させるにはNSManagedObjectContext saveメソッドを使う。変更前の状態に戻すにはNSManagedObjectContext rollbackメソッドを使う
おそらく一番異なるところは、RDBMSに対するデータベースアクセスの結果セットが列と行で構成されるテーブルに対し、Core Dataの場合は、複数のオブジェクト(NSManagedObject)が返されるというところでしょうか。ただし、NSManagedObjectは複数のKeyを持つので、Keyを「列」、NSManagedObject一つ一つを「行」と考えるとよいと思います。
・・・思ったより長くなりそうなので次回に続きます。
※勉強中の為、間違っているところや説明が足りないところがあると思います。その場合はご指摘いただくと助かります。