これは、CoreDataが属性を自動的に移行できないために発生します。これは、文字列が常にintに収まるとは保証できないためです(データが収まることがわかっている場合でも)。
したがって、実行する必要があるのは、マッピングモデルを使用することです。方法は次のとおりです。
- Xcodeで、新しいマッピングモデルを作成し([ファイル]>[新規]>[新しいファイル])、[コアデータ]セクションで[マッピングモデル]を選択します
- ウィザードでソースモデルとターゲットモデルを選択します
- これにより、基本的に軽量移行と同じ場所に配置されます。一部のマッピングをオーバーライドするオプションがあることを除いて、すべてが自動的に実行されます。具体的には、あなたに問題を与えているもの。
- 新しいマッピングポリシークラスを作成します(Extend
NSEntityMigrationPolicy
)
- ソースインスタンスを提供するを実装
createDestinationInstancesForSourceInstance:entityMapping:manager:error:
して、その文字列をintに変換し、新しいストアに保存できるようにします。
コードは次のようになります。
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];
// Copy all the values from sInstance into newObject, making sure to apply the conversion for the string to int when appropriate. So you should have one of these for each attribute:
[newObject setValue:[sInstance valueForKey:@"xyz"] forKey:@"xyz"];
[manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];
}
- 次に、マッピングモデルでそのポリシーを設定するだけです。マッピングモデルファイルを選択し、適切なエンティティマッピングを選択して、右側のパネルでCustomPolicyを設定します。
Core Dataを初期化する場合は常に、移行設定を変更して自動型推論を削除してください
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
それはそれであるはずです...