ページ

2010年5月18日火曜日

CoreData - リレーションシップ(2) SQLiteのスキーマ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: CoreData - リレーションシップ(1) シンプルなモデル

昨日作成したモデルがどのような SQLite スキーマに変換されたのか見てみる。

モデルはこれ。



SQLite はこう(見やすい様に整形してある)。
sqlite> .schema zblogentry
CREATE TABLE ZBLOGENTRY (
  Z_ENT INTEGER,
  Z_PK INTEGER PRIMARY KEY,
  Z_OPT INTEGER,
  ZCREATED TIMESTAMP,
  ZTITLE VARCHAR,
  ZCONTENT VARCHAR );

sqlite> .schema ZTAG
CREATE TABLE ZTAG (
  Z_ENT INTEGER,
  Z_PK INTEGER PRIMARY KEY,
  Z_OPT INTEGER,
  Z1TAGS INTEGER,
  ZNAME VARCHAR );

CREATE INDEX ZTAG_Z1TAGS_INDEX ON ZTAG (Z1TAGS);

BlogEntry に対応する ZBLOGENTRYテーブルには基本的にモデルで定義した属性が定義されている。関連の tags を格納するカラムは無い。

一方、Tag に対応する ZTAGテーブルには name属性の ZNAMEの他に、Z1TAGS というカラムが追加されている。さらにこの Z1TAGS にはインデックスが張られている。


実際のデータはこんな感じ。

sqlite> select * from zblogentry;
1|1|1|296022528.422181|CoreData のリレーションしっぷについて|かくかくしかじか
1|2|1|296022528.422324|iPad 5/28発売|かくかくしかじか

sqlite> select * from ztag;
2|1|1|1|iPhone
2|2|1|1|Mac
2|3|1|2|iPad

あれ。BlogEntry と Tag の関連を ZTAG.Z1TAGS で持つとしたら、情報が不足しないか?
BlogEntryとTagの紐付けは次の様に設定した。

[CoreDataの...] => [iPhone][Mac][iPad]
[iPad 5/28発売] => [iPad]

となると、ZTAGの iPadのレコードに ZBLOGENTRYの2レコードが紐づかなければならないが、見たところ1レコード([iPad 5/28発売]の方)にしか紐づいていない。


プログラムを実行し、前回のデータのフェッチしてみると実際、[CoreDataの...]の方のタグは [iPhone][Mac] のみで、[iPad]が欠けている。
2010-05-21 08:37:38.840 CoreDataRelationship[15129:10b] title=CoreData のリレーションしっぷについて
[15129:10b] *tag*: Mac
[15129:10b] *tag*: iPhone
[15129:10b] title=iPad 5/28発売
[15129:10b] *tag*: iPad


うーむ。何が悪いのだろうか。
モデリング方法?それとも設定?


続く。