1

注意!Core Data Migration - Table Already Existsを見たことがありますが、問題は解決しませんでした。

私は自分のデータ モデルの軽量の移行を行おうとしていますが、この時点で失敗しています。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                         nil];
store = [self addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
                    URL:url options:options error:&error];

エラーメッセージは次のとおりです。

2012-09-06 17:14:19.450 Selene[79064:c07] CoreData: error: (1) I/O error for database at /Users/colin/Library/Application Support/iPhone Simulator/5.1/Applications/E1638F38-B13A-4728-91CD-CC380E761544/Library/Application Support/Selene/.Selene.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'table ZMEASUREMENT already exists'

データ モデルに対する実際の変更は、完全に異なるテーブル ZCYCLE にオプションの文字列列を 1 つ追加することです。したがって、ZMEASUREMENT について文句を言っても意味がありません。

コア データのインスタンス化を実行しましたが、NSManagedObjectModel は正しく読み込まれているように見えます (新しいバージョン)。URLは正しいです。

xcode で Clean を作成し、iOS シミュレーターで内容と設定をリセットし、(Core Data を使用して) バージョン 1 の sqlite ファイルを最初から再生成し、バージョン 2 への移行を再度試みました。サイコロはありません。したがって、私のsqliteファイルが何らかの理由で破損しているわけではありません。

データ モデル情報は、クリーニングで見逃した可能性のある別の場所に保存されていますか?

軽量の移行で実際に何が起こっているかをデバッグする他の方法はありますか? 上記の「テーブルが既に存在します」というエラー以外の情報が見つかりません。これは意味がありません。addPersistentStoreWithType: 内で何が起こっているかは、私にはわかりません。

移行を続行するために私が見つけた唯一の方法は、移行の一環として、Core Data が不満を言っているテーブルの名前を ZMEASUREMENT に変更することです。これは 1 回の移行でのみ機能し、2 回目の移行を行うにはテーブルの名前を再度変更する必要があります。データモデルを変更するたびに名前を変更しなければならないテーブルという考えには、私は本当に満足していません。確かに Core Data はこれほど壊れていません。

編集: 役立つ場合は、テーブル ZMEASUREMENT の属性のリストを次に示します。これは何か変ですか?

@property (nonatomic) int epochDay;         // Integer32 indexed
// time as number of seconds since local midnight, to avoid time zone and DST issues
@property (nonatomic, strong) NSNumber *localTime;  // Integer32 optional

// stored in Kelvins, to force me to test temperature conversion code properly
@property (nonatomic, strong) NSNumber *temperatureK;   // Float optional
@property (nonatomic) BOOL excludeTemperature;      // Boolean default=NO
@property (nonatomic, strong) NSNumber *fluidCode;  // Integer16 optional
@property (nonatomic, strong) NSNumber *openingCode;    // Integer16 optional
@property (nonatomic, strong) NSNumber *positionCode;   // Integer16 optional
@property (nonatomic, strong) NSNumber *textureCode;    // Integer16 optional
@property (nonatomic, strong) NSNumber *rateCode;   // Integer16 optional
@property (nonatomic, strong) NSNumber *heightCode; // Integer16 optional
// try renaming the internal property to see if it helps lightweight migration
@property (nonatomic, strong) NSString *commentDPL; // String optional
@property (nonatomic, strong) NSString *comment;    /* derived property (alias for commentDPL) */
@property (nonatomic, strong) NSSet *notes;     // Optional to-many relationship to MeasurementNote

オプションではないフィールドは、epochDay と excludeTemperature のみです。

4

3 に答える 3

1

名前が組み込みメソッド名と一致する属性またはエンティティを使用していますか? これらのリストはありませんが、「name」、「count」などの名前は、この影響により問題を引き起こす可能性があります。

また、ひょっとして新属性は十七番目ですか?

于 2012-09-06T22:37:28.097 に答える
0

さて、最終的に私の問題を解決するために、xcdatamodeldディレクトリ全体を削除し、データモデルを最初から再生成する必要がありました。どういうわけかそこに腐敗があったと思いますか?今はうまくいくようです。成功を祈っている。これが解決策として満足していないのは、すべてのベータテスターに​​保存したデータを破棄してやり直すように依頼するためですが、私が持っているのはそれだけのようです。

正確に何が悪かったのか、誰かがもっと良い考えを持っているなら、私はそれを聞きたいです。私のアプリは、保存されたデータで信頼できることで存続し、死にます。すべてをゴミ箱に捨てて最初からやり直すというこの「解決策」は、有料の顧客がまだいる場合は、初心者ではありません。コアデータは今私を緊張させています。

于 2012-09-07T19:53:04.130 に答える