2

Core Data と Objective-C は初めてです。Web サービスから JSON データを取得し、それをコア データと同期するプロジェクトに取り組んでいます。私はこのチュートリアルに成功し、問題なく JSON をコア データに取り込むことができました。私が問題を抱えているのは、対多関係に関連付けられた NSSet の更新です。これまでのところ、更新することはできますが、そうすると、セット内に重複するエントリが作成されます。たとえば、カスタム ManagedObject Entity1 で Xcode によって生成されたアクセス メソッドを使用してみました。

Entity1<-->>Entity2<-->>Entity3

このコードを使用して、Entity2 オブジェクトを Entity1 に追加します。

    NSNumber *parentIdNumber = [record valueForKey:@"parent_id"];
    NSArray *parentIdArray = [NSArray arrayWithObject:parentIdNumber];
    NSArray *parentEntityArray = [self managedObjectsForClass:@"Entity1" sortedByKey:@"id" usingArrayOfIds:parentIdArray inArrayOfIds:YES];
    Entity1 *parentEntity = [parentEntityArray lastObject];
    [parentEntity addEntity2Object:(Entity2 *)newManagedObject];

実行時に各変数を確認した後、最後の行まですべてが正しく機能していることを確認しました。Entity2 を Entity1 に追加すると、実際にはオブジェクトが追加されます。ただし、3 つの異なる Entity2 オブジェクトを追加しようとすると、Entity1 に 3 つの重複した Entity2 オブジェクトが作成されたように見えます。3 つの重複は、追加された Entity2 の最後のインスタンスのものです。

また、この回答のアプローチを使用してみました: https://stackoverflow.com/a/5370758/2670912。次のようになります。

    NSNumber *parentIdNumber = [record valueForKey:@"parent_id"];
    NSArray *parentIdArray = [NSArray arrayWithObject:parentIdNumber];
    NSArray *parentEntityArray = [self managedObjectsForClass:@"Entity1" sortedByKey:@"id" usingArrayOfIds:parentIdArray inArrayOfIds:YES];
    Entity1 *parentEntity = [parentEntityArray lastObject];
    NSMutableSet *entity2Set = [parentEntity mutableSetValueForKey:@"entity2"];
    [entity2Set addObject:newManagedObject];

これは、追加された 3 番目のオブジェクトの 3 つの重複エントリを取得する代わりに、追加された最初のオブジェクトの 3 つの重複エントリを取得することを除いて、同じ重複エントリの結果になります。

誰がこれを引き起こしているのか考えていますか?

4

1 に答える 1

0

私が使用していたコードの断片は、正しく機能していることが判明しました。問題は、データを表示していたときにUITableView、エンティティの数を正しく把握していたNSSetため、正しいセル数が表示されていたことです。ただし、コードがありました:

    NSSet *entitiesSet = [self.selectedEntity1 valueForKey:@"entity2"];
    NSArray *entities = [entitiesSet allObjects];
    Entity2 *entity = [entities objectAtIndex:[indexPath indexAtPosition:0]];

これにより、セルに最後のオブジェクトのみが表示され、NSSet重複しているように見えます。0を次の1ように変更して問題を修正しました。

    Entity2 *entity = [entities objectAtIndex:[indexPath indexAtPosition:1]];
于 2013-08-31T20:27:12.063 に答える