データベース スキーマを見せてもらえますか? 私の推測では、オブジェクトの継承を自由に使用したと思います。
Core Data は、親エンティティ用の 1 つのテーブルを作成し、子エンティティによって使用されるすべてのフィールドを結合するための列を追加することで、SQL ストアに継承を実装します。そのため、1 つのエンティティで 2 つのフィールドだけを名前変更したと思うかもしれませんが、Core Data は、そのエンティティから継承する、またはそのエンティティの共通の祖先を持つすべてのオブジェクトに変更を適用する必要があります。
特定のスキーマでは、少なくともジャンル、オーディオトラック、スタジオ、ディレクター、ストア、ムービー、条件、地域、所有者、アスペクト比、年、マイレーティング、エピソード、エディション、フォーマット、プロデューサー、エンティティ、アイテムがあるように見えます。 Writer、AudienceRating、SeenIt、Movie が下降。自動的に分析するのではなく、ログを目で読んでいるため、他にもある可能性があります。そのため、Core Data は Item という名前の 1 つのテーブルを作成し、そこにこれらのエンティティのすべてのインスタンスが格納されます。これらのエンティティ (または私が見つけられなかった可能性のある他のエンティティ) のいずれかが変更されるたびに、Core Data はそれらのエンティティのすべてのインスタンスのすべてのレコードを更新する必要があります。
そのため、次のように表示されます。
CREATE TABLE ZITEM ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER,
ZUNIQUEID INTEGER, ZCOLLECTIONSTATUS INTEGER, ZHASCOVER INTEGER, ZINDEX INTEGER,
ZPLOTNOTE INTEGER, ZUSERVALUES INTEGER, ZPURCHASEDATEDAY INTEGER,
ZPURCHASEDATEMONTH INTEGER, ZPURCHASEDATEYEAR INTEGER, ZRELEASEDATEDAY INTEGER,
ZRELEASEDATEMONTH INTEGER, ZRUNTIME INTEGER, ZVIEWINGDATEDAY INTEGER,
ZVIEWINGDATEMONTH INTEGER, ZVIEWINGDATEYEAR INTEGER, ZAUDIENCERATING INTEGER,
ZCONDITION INTEGER, ZEDITION INTEGER, ZFORMAT INTEGER, ZLOANER INTEGER,
ZLOCATION INTEGER, ZMYRATING INTEGER, ZOWNER INTEGER, ZSEARCH INTEGER,
ZSEENIT INTEGER, ZSEENWHERE INTEGER, ZSERIES INTEGER, ZSTORAGEDEVICE INTEGER,
ZSTORE INTEGER, ZYEAR INTEGER, ZRANK INTEGER, ZTYPEID INTEGER,
ZCOLLECTIBLE INTEGER, Z3_COLLECTIBLE INTEGER, ZBIN INTEGER, ZSORTORDER INTEGER,
ZSECTION VARCHAR, ZCLZID VARCHAR, ZCONNECTHASH VARCHAR, ZSORTTITLE VARCHAR,
ZTITLE VARCHAR, ZACTORS VARCHAR, ZCLZMEDIAID VARCHAR, ZCURRENTVALUE VARCHAR,
ZIMDBNUMBER VARCHAR, ZIMDBRATING VARCHAR, ZLOANDATE VARCHAR, ZLOANDUEDATE VARCHAR,
ZPURCHASEPRICE VARCHAR, ZSTORAGESLOT VARCHAR, ZTITLEEXTENSION VARCHAR,
ZUPC VARCHAR, ZTHEDESCRIPTION VARCHAR, ZURL VARCHAR, ZDISPLAYNAME VARCHAR,
ZSORTNAME VARCHAR )
これは、Item のすべての子孫のすべてのフィールドの和集合を含むテーブルです。また、たとえば AudienceRatings のフェッチが次のように実行される理由もあります。
SELECT t0.Z_ENT, t0.Z_PK, t0.Z_OPT, t0.ZSECTION ... FROM ZITEM t0 WHERE t0.Z_ENT = ?
そう:
- Core Data は 50 行をはるかに超えて更新しています。
- これを避けたい場合は、継承を避ける必要があります。
- 「is a」関係と「has a」関係を回避できますが、Core Data の双方向の性質により、しばしば面倒になります (30 個のオブジェクトが Item に接続している場合、Item は他のオブジェクトに 30 個の接続を持っている必要があります)。
- Item が統一されたタイムスタンプのような些細なものである場合、通常はすべてのエンティティにタイムスタンプ プロパティを追加し、それぞれが共通のコードを呼び出してそれを確立する方が簡単です。