Core Data アプリケーションを作る
Xcode で CoreData アプリケーション、まあ、データベースアプリケーションを作る方法をメモる。
まず、メニューから新規プロジェクトを選び、Cocoa-Ruby Core Data Application を選ぶ。
通常の Cocoa-Ruby Application と違って、AppDelegate Class ファイルと DataModel ファイルがはじめから作られている。
まず (project name)_DataModel.xcdatamodel ファイルをダブルクリックして開く。
左上のエンティティのテーブルの左下にある+をクリックして、エンティティを追加する。いわゆるデータベースのテーブル。
追加するとこんな感じになる。テーブルに Entity が現れるのと同時に、下の部分にダイアグラムが現れる。左上のところで名前をつける。
ここでは、英和単語データベースを作ろう、ということで、EJDic という名前にしてみた。Entity は大文字で始めるらしい。
この名前は、下のダイアグラムの部分にも反映される。
次に、データベースのフィールドにあたる属性を追加していく。プロパティのテーブルの左下の+をクリックして、
属性を追加を選ぶ。
するとテーブルに追加される。テーブルの右に属性の内容が表示されるので、名前をつけてデータ型を選ぶ。名前は小文字で始める。
データ型には次のものが選べる。
ここでは、英和単語データベースにしたいので、英単語 eng と日本語の訳語にあたるもの jap を追加する。
データ型には文字列を選ぶ。すると、テーブルに次のように追加されるはず。
これも、ダイアグラムに反映される。
ここで、データベースの用意ができたので、nib ファイルに貼付ける。
Xcode に戻って、MainMenu.nib をダブルクリックして、Interface Builder で開く。
開いたら、ダイアグラムのエンティティ EJDic を Control キーを押しながら Interface Builder の Window にドラッグアンドドロップする。
すると、次のウィンドウが現れるので、まず、View のタイプを選ぶ。
ここでは、Master/Detail View を選ぶ。
すると、テーブルが表示されて、検索窓、入力欄、追加ボタンなどを加えることができるので、オプションは3つともチェックを入れる。
すると、それが Preview に反映される。
これでよければ、Next をクリックして次へ進む。
次に、インターフェイスに追加するプロパティを聞かれる。ここでは、英単語と日本語の訳語を両方とも含めたいので、
チェックがついたままで Finish をクリックする。
すると、ウィンドウにインターフェイスが追加される。ただ単に追加されるだけなので、自分の好みに合うようにレイアウトを変更する。
ここでは面倒くさいので、ウィンドウの大きさを合わせるだけにした。
ここで、インターフェイスを追加すると、エンティティの名前がついた Array Controller が nib ファイルに追加される。
次に、これをプロジェクトの AppDelegate にバインドする。
(Entity Name) Array Controller を選んで、インスペクタのバインディングを表示し、Parameters を開く。
この Managed Object Context を AppDelegate につなぐ。まず、Bind to: の中から、AppDelegate を選ぶ。
選んだら、チェックボックスにチェックを入れる。
これで、バインドされたので、nib ファイルを保存する。ただ、Core Data を使ってアプリケーションを作ると、
OS X 10.5 Leopard 以降でしか動かないので、そのままではエラーが出る。
この x をクリックするか、ツールバーの Info をクリックして、Info パネルを表示する。
ここで、Development Target を Mac OS X 10.5.x に変更してパネルを閉じる。これで、エラーなく nib ファイルの保存ができる。
Xcode に戻り、ビルドと実行をする(Command + R)。
これで、Add ボタンを押してデータを追加していく。Remove でデータの削除。
Core Data Application のデフォルトでは、アプリケーション終了時にデータが保存される。データは、xml ファイルで、
ホームフォルダのライブラリ -> Application Suport -> (アプリケーション名)のフォルダに保存される。
標準で検索もできる。
ここまで、一行もスクリプトを書くことなく来た。要は、スクリプトを書かなくても、簡単なデータベースソフトが作れるということ。
最後に、Care Data アプリケーションはデフォルトで XML ファイルにデータを保存するようになっているけど、大きなデータを扱うようにしたい場合には、
メモリやスピードなどの面でいろいろと問題が出てくる。そこで、これを SQLite を使うように変えてみる。
変えるところは2カ所。両方とも managedObjectContext のメソッドを定義している部分で、一つは保存するファイル名、もう一つは保存形式を指定するところ。
デフォルトでは(プロジェクト名).xml というファイル名になっているところを、何でもいいので別のものに変える。データベースファイルなので、
.db とかでもいい。プログラム固有の拡張子にすれば他のプログラムで開かれることもないので、それとわかるものを付けてもいい。まあ、.ejdb とでもしておく。
url = OSX::NSURL.fileURLWithPath(storeFolder.stringByAppendingPathComponent("CoreData_test.ejdb"))
もう一つは、NSXMLStoreType となっていて XML で保存するようになっているので、これを NSSQLiteStoreType に変える。
if coordinator.addPersistentStoreWithType_configuration_URL_options_error(OSX::NSSQLiteStoreType, nil, url, nil, error) then
これで、SQLite のデータベースファイルにデータが保存される。