2013-06-11 10 views
8

私は新しいモデルを作成し、エンティティの2つのフィールドの名前を変更しました。このエンティティは以前のバージョンのアプリケーションでは使用されていなかったので、データベース内の新しい更新されたエンティティにマップしませんでした。その結果、マッピングは新しいマッピングではありませんが、移行は非常に遅いです(メインテーブルで約50行に3秒)。コアデータが新しいデータベースを作成して古いデータベースを削除しているのか、すべてのデータを再挿入しているのか疑問に思っています。移行ログファイルは、http://cl.ly/3H1v252R1p1cコアデータの移行は遅いですが、移行することはありません

psです。 NSInferMappingModelAutomaticallyOptionがYESの場合、これはコアデータによって即時マッピングされるため、データ損失が発生する可能性があることを意味しますか?

ありがとう

答えて

3

あなたのデータベーススキーマを教えていただけますか?私の推測では、あなたは自由にオブジェクト継承を使用しています。

コアデータは、親エンティティ用の単一のテーブルを作成し、子エンティティによって使用されるすべてのフィールドの結合用の列を追加することによって、SQLストア内の継承を実装します。したがって、1つのエンティティで2つのフィールドのみの名前を変更したと思うかもしれませんが、コアデータは、そのエンティティから継承する、またはそのエンティティの共通の祖先を持つすべてのオブジェクトに変更を適用する必要があります。

ジャンル、AudioTrack、スタジオ、ディレクター、ストア、ムービー、条件、地域、所有者、AspectRatio、年、MyRating、エピソード、エディション、フォーマット、プロデューサー、作家、AudienceRating、SeenIt、映画降下。自動的に分析するのではなく、あなたのログを目で見ているように他のものがあるかもしれません。したがって、Core Dataは、これらのエンティティのすべてのインスタンスが格納されるItemという1つのテーブルを作成します。これらのエンティティ(または見つからなかった可能性のあるもの)のいずれかが変更されると、コアデータはこれらのエンティティのすべてのインスタンスのレコードを更新する必要があります。

あなたが見る理由です:項目のすべての子孫のすべてのフィールドの組合を含むテーブルです

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) 

。それはまた、AudienceRatingsフェッチとして実行されます。

だから、
SELECT t0.Z_ENT, t0.Z_PK, t0.Z_OPT, t0.ZSECTION ... FROM ZITEM t0 WHERE t0.Z_ENT = ? 

  • Core Dataはたくさんに50の以上の行を更新しています。
  • これを避けたい場合は、継承を避ける必要があります。
  • 「関係はあります」との関係はありませんが、Core Dataの双方向性により、しばしば苦痛になります(30個のオブジェクトがItemに接続していれば、Itemは他のオブジェクトと30個の接続を持つ必要があります) ;
  • Itemが均一なタイムスタンプのような単純なものであれば、通常はすべてのエンティティにタイムスタンププロパティを追加し、共通のコードを呼び出すだけで簡単に設定できます。
+0

こんにちは、私は多くの子供(http://cl.ly/image/3T3Z1N0M2v18)で親エンティティを持っていますが、このエンティティは変更されていません。私は実際にテーブルのリンクの2つのフィールドの名前を変更しましたが、これらのフィールドは古いモデルから新しいモデルにマップされていません(したがって、データを再挿入する必要はありません)。名前を変更したフィールドは空のテーブルに属しているため、データベースはそのまま残す必要があります。 – aneuryzm

+0

コアデータのSQLストアでは、 'A'と' B'が 'X'から始まっている場合、' A'と 'B'の両方のインスタンスが格納されている' X'という単一のテーブルがあります。したがって、エンティティ 'B'を更新すると、' X'テーブルを更新する必要があるため、コアデータは 'A'と' B'の両方のインスタンスをすべて再処理しなければなりません。あなたの場合、私の疑念は、更新されるインスタンスの数が重要なものになってしまうことです。 – Tommy

+0

これは正解です。あなたはテーブルが空だと思うかもしれませんが、そうではありません。実際には、すべてのものを含むテーブルが1つしかありません(エンティティの継承のため)。 – Wain

3

iOSのコアデータは、データストレージとしてSQLiteを使用しています。コアデータは、この制限を回避していますので、SQLiteは、ALTER COLUMNをサポートしていません:

  1. が更新された列
  2. 新しいテーブルにレコードを挿入して新しいテーブルを作成し、古いテーブル
  3. の名前を変更する
  4. 古いテーブルを削除する

これはもう少し詳しく説明しているので、良い答えはhereです。

この操作を実行中にコアデータのデータが失われることはありませんでした。私はAppleがこれを防ぐための保護手段を実装していると考えていますが、確かめるためにApple DTSに直接連絡する価値があります。

+0

名前を変更したフィールドをマッピングしていないので、フィールドを再挿入しないでください。 – aneuryzm

+0

名前を変更した2つのフィールドは、空のテーブルに属します。 – aneuryzm

関連する問題