2

そのため、Core Data モデルをコードに変換して、静的ライブラリに簡単に収まるようにしました。残念ながら、スムーズな変換ではありません。

gameToPlayer という名前の別のクラスの関係として新しいプレーヤーを挿入しようとすると、このエラーが発生します。

Unacceptable type of value for to-one relationship: property = "player"; desired type = (null); given type = Player; value = <Player: 0x178ba9e0>

GameToPlayer の作成は次のとおりです。

    gameToPlayerEntity = [[NSEntityDescription alloc] init];
    [gameToPlayerEntity setName:@"GameToPlayer"];
    [gameToPlayerEntity setManagedObjectClassName:@"GameToPlayer"];

    gameToPlayerPlayer = [[NSRelationshipDescription alloc] init];
    [gameToPlayerPlayer setDestinationEntity:playerEntity];
    [gameToPlayerPlayer setInverseRelationship:playerGames];
    [gameToPlayerPlayer setDeleteRule:NSNullifyDeleteRule];
    [gameToPlayerPlayer setOptional:YES];
    [gameToPlayerPlayer setName:@"player"];
    [gameToPlayerPlayer setMaxCount:1];
    [gameToPlayerPlayer setMinCount:1];

そしてプレーヤーの作成:

    playerEntity = [[NSEntityDescription alloc] init];
    [playerEntity setName:@"Player"];
    [playerEntity setManagedObjectClassName:@"Player"];

    playerGames = [[NSRelationshipDescription alloc] init];
    [playerGames setDestinationEntity:gameToPlayerEntity];
    [playerGames setInverseRelationship:gameToPlayerPlayer];
    [playerGames setDeleteRule:NSCascadeDeleteRule];
    [playerGames setName:@"games"];
    [playerGames setOptional:YES];
    [playerGames setMaxCount:0];
    [playerGames setMinCount:0];

そして、クラッシュが発生している場所 (すべての NSLogs がこれを追跡するためにそれらを使用していたことをお詫びします) プレーヤーを設定した場所で停止します。

    NSLog(@"Create the GameToPlayer");
    GameToPlayer *orderObj = [NSEntityDescription insertNewObjectForEntityForName:@"GameToPlayer" inManagedObjectContext:[SDDataManager dataManager].managedObjectContext];
    NSLog(@"Set the Game");
    [orderObj setGame:newGame];
    NSLog(@"Set the Player");
    [orderObj setPlayer:player];
    NSLog(@"Set the Order");
    [orderObj setOrder:[NSNumber numberWithInt:[selectedPlayers indexOfObject:player]]];
    NSLog(@"Add to Array");
    [orderObjs addObject:orderObj];

今、私は実際に問題を知っていると思います。私の ManagedObjectModel のカスタム初期化。gameToPlayerEntity は playerEntity の前に作成されます。したがって、gameToPlayerEntity が作成されるとき、playerEntity は実際には NULL です。ただし、ファイル内の何かを変更すると、既存のデータベースをマップできなくなったように見えるため、単純に並べ替えたり、プロパティを作成したり、何かを修正したりすることはできません...

そして、問題になると予想されるxmlモデルのようなコードモデルをバージョン化する方法を示すドキュメントのどこにも見つかりません。ヘルプやヒントをいただければ幸いです。これを機能させる方法を理解しようとしています。

アップデート

この変換の前に、私はすでに軽量の移行を使用しており、データベースの 4 回目の反復を行っていたことに言及する価値があると考えました。

ここに画像の説明を入力

更新 2

私は完全に最初からやり直すことで、それを機能させることができました。投稿されたものから先に進もうとする代わりに。各エンティティが必要なときに一度だけ作成されるように、すべてがプロパティに変換されています。これは、ビジュアル モデルからコード モデルへの変換として機能します。ただし、このモデルが必然的に変更される将来、バージョニングを理解する必要があることは間違いありません。バージョン管理は、まずこの問題の根源です。したがって、xcode インターフェイスを使用せずにバージョン管理を行う方法について誰かが光を当てることができれば、私はあなたの考えを聞きたいです。

4

2 に答える 2

2

これは必ずしもあなたの問題ではないと思いますが、このエラーが発生した人のために、この別の可能性を投稿したいと思います. ある永続ストアから別の永続ストアにデータを移動しているときにこのエラーが表示される場合 (たとえば、フォールバック ストアから iCloud ストアに移動する場合)、新しい管理対象オブジェクトを作成するために使用している NSEntityDescription は、古いコピーの NSEntityDescription からのものである可能性があります。オブジェクト (したがって、間違った管理オブジェクト コンテキスト)。

次のようなコードを実行している場合:

NSEntityDescription *entity = [oldObj entity];
YourClass *newObj = [[YourClass alloc] initWithEntity:entity
                       insertIntoManagedObjectContext:moc];

挿入先のコンテキストからエンティティの説明を取得する追加の手順を実行する必要があります。

NSEntityDescription *entity = [oldObj entity];
NSEntityDescription *goodEntity = [NSEntityDescription entityForName:entity.name
                                              inManagedObjectContext:moc];
YourClass *newObj = [[YourClass alloc] initWithEntity:goodEntity
                                       insertIntoManagedObjectContext:moc];

Cocoa Dev メーリング リストに投稿した Pavel Kapinos の功績によるものです。 http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg24863.html

于 2013-01-03T18:16:40.487 に答える
0

メソッドの最初にエンティティと関係を初期化し、すべてのプロパティを設定するのは難しいでしょうか?

playerEntity = [[NSEntityDescription alloc] init];
gameToPlayerEntity = [[NSEntityDescription alloc] init];
gameToPlayerPlayer = [[NSRelationshipDescription alloc] init];

次に、メソッドの後半のある時点で:

[gameToPlayerPlayer setDestinationEntity:playerEntity];
于 2012-08-20T15:31:54.497 に答える