(前回)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 にはインデックスが張られている。
実際のデータはこんな感じ。
一方、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
うーむ。何が悪いのだろうか。
モデリング方法?それとも設定?
続く。