2010-01-11
CoreDataの構成
CoreData | |
![]()
サンプルのCoreDataBooksを弄くり通して移植とか試みた結果、どこがどうなってるのかようやく把握できた感じなのでメモ。
そもそも何故分かりづらいのか
CoreDataはSQliteをObjective-Cのみで操作できることにメリットがあるわけですが、その操作を行うためのクラス名、取り扱い方に問題があります。
イメージしずらいネーミング
各クラスの解説を読むと判明しますが、実際には他の言語で使われているDBとの接続を行うための各種クラスと、CoreData関連クラスがやってることには、あまり違いはありません。ただ、それらのクラスと余りに剥離したネーミングというのが一つ。
複数のDBの接続を同時に取り扱っている
もう一つは、あくまでCoreDataは「複数のDBとそれらDBとの接続情報」をひとまとめにした代物であるため、他の言語でのDBと同じ感覚で取り扱うとズレが生じるということ。
TableView専用というわけではないNSFetchedResultsController
さらにもう一つ、NSFetchedResultsController自体はCoreDataから取得したデータの配列をキャッシュしているコントローラであり、別にUITableViewController専用のオブジェクトではない、ということ。
CoreDataのコンテキスト構成
コンテキスト以下の構成図を貼ってみます。
ColumnもといEntityを追加したい場合にはNSManagedObjectModelへの操作、接続するDBを増やしたい場合にはNSPersistentStoreを追加するといった形です。
NSPersistantStore追加の際の実DBファイル
接続するDBを増やす場合にはNSPersistentStoreを追加するわけですが、実体のファイルもその際に自動で生成されています。
データ追加
NSEntityDescriptionで追加先のEntityを指定すると生成されるオブジェクト(レコード相当)に値を入れて保存、という流れです。DBへのレコード追加をSQLを直接触れずに行う形です。
データの読み込み
NSFetchedResultsControllerを生成した時点で、データの取得ができ上がるため、あとは取得したデータの配列からインデックスを指定して取得という流れ。
まとめ
NSManagedObjectContextを構成する際の煩雑さも原因だと思うので、NSManagedObjectContextまでの生成過程を一つのクラスにして分離したほうが、なにかと分かりやすいかと思います。
あと、これらを一つ一つ確かめていくとどこかで同じ構成をみたような感覚があったのですが、PerlにおけるDBIx::Classがそれでした。どんな感じなのかは、
を読むと分かりやすいと思います。
2009-10-10
2009-10-03
ビルド時にClangを自動で実行させる
現行の最新Xcodeは、ソースコードの静的解析を行うClangがメニューから実行できるようになっています。逐一設定実行する手間が省けて助かる事間違い無しなんですが、毎回clangのために余計な操作をするのは本当面倒です。
余り知られていませんが、このClangも自動で実行できるようになっています。デフォルトで実行がONになっていれば良いとは思うんですが、多分それだと初学者の壁が只管高くなるとかそんな具合だと思います。
設定方法
2009-09-22
CoreDataを使う場合のトラブルシュート
CoreData | |
![]()
Macでのデータベース取り扱いが楽になるというCoreDataですが、確かにMac用アプリでは開発が楽になるようです。というのも、iPhoneでは色々とコーディングが要求されてしまうから。結果、はまってしまうところがでて、それが解消されにくい場合は、思い切ってFMDBで行うほうが幸せかもしれません。
試行錯誤しつつ組み込みに挑戦していますが、エラーが完全には解消されず詰まっている状態です。現状に至るまでに分かったいくつかのはまりポイントについてまとめてみます。
+entityForName: could not locate an NSManagedObjectModel for entity...
xcdatamodel内でEntityの名称が間違っている場合や、NSEntityDescriptionを生成する以前にNSPersistentStoreCoordinatorなどを適切に生成していない、など。
Z_PKなどの、頭にZが付くコラムが足りないと表示される
sqliteファイルを手動作成した場合、CoreDataに用いるsqliteのテーブルおよびコラム名は、イニシャルがZで始まる必要があります。(NameならZNameになる、など)
また、CoreDataが用いる専用のテーブルを作成する必要もあります。
参考:Core Data Error: Can’t Find Model for Source Store
CREATE TABLE Z_PRIMARYKEY (Z_ENT INT Primary Key, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER);
CREATE TABLE Z_METADATA (Z_VERSION INT Primary Key, Z_UUID VARCHAR(255), Z_PLIST BLOB);
Entityを収めたテーブルにも、システムが管理に用いるためのコラムの追加が必要です。
Z_OPT INTEGER
Z_PK INTEGER PRIMARY KEY
2009-08-29
Snow Leopardインストールで操作が必要になるもの幾つか
xcode | |
![]()
Snow Leopardをインストールして、かなり動作がきびきびしているものと思われます。が、それの代償というべきか、色々と環境調整も必要になりました。以下ログのようなものです。
XCodeのインストール
Snow Leopardのインストールディスクにアップグレード版が含まれています。ディスク不良か読み込み不良なのか、いずれの場合でもインストールに失敗した場合はXCode 3 - Snow Leopard - Apple Developers Connection(要ログイン)からダウンロードしましょう。
iPhone SDK for Snow Leopardのインストール
同じくiPhone Developer Connectionよりダウンロードします。
MacPortsのインストール
前準備なしにSnow Leopardにアップグレードしてしまうと、portコマンドを実行しただけでエラーとなります。アップグレード前に一度全て削除推奨です。
(参照:Snow Leopardにアップデートした後に気をつけること)
sudo port -f uninstall installed
うっかり削除する前にインストールしてしまったら、まずSnow Leopard対応インストーラにてインストール。その後、上記の全削除を実行。そして、必要なものを入れていきます。
なお、対応インストーラ導入後に
sudo port upgrade installed
にてまとめてアップデートという手段もありますが、ライブラリによってはアップグレードに失敗してそこから先に進まなくなるものもあるので注意が必要です。



