1

私は1対多の関係Personに属するエンティティを持っていDepartmentます。

関連付けられてDepartmentいるがなくなったときに削除できるようにしたいと思います(エンティティの削除または's属性の変更のいずれかによって)。現在、私は次のハンドラーを使用してこれを実行しようとしています(現在、削除を確認し、適切に削除しようとしています)。PersonPersonPersondepartmentNSManagedObjectContextObjectsDidChangeNotification

- (void)managedObjectDidChange:(NSNotification *)notification {

    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
    for (NSManagedObject *obj in updatedObjects) {
        if ([obj.entity.name isEqualToString:@"Person"]) {
            NSLog(@"Person Changed");

            NSManagedObject *department = [(Person *)obj department];
            NSLog(@"%i", [[department valueForKey:@"person"] count]);

            if ([[department] valueForKey:@"person"] count] == 0) {
                NSLog(@"Department has no more people associated with it");
                // deletion code
            }
        }
    }
}

ただし、人を削除しても、所属部署の人数は変わりません。Departmentエンティティに対してフェッチを実行していません。それは私がすべきことですか?

4

2 に答える 2

9

最も簡単な方法:Departmentエンティティクラスに実装willSaveし(各エンティティに独自のクラスを与えていますよね?*)、Departmentにとをチェックさ[self isDeleted] == NO[[self person] count] == 0、そうであれば削除します。(エンティティが内部で自分自身を変更すると、willSaveへの別の呼び出しがトリガーされるため、のチェックisDeletedはオプションではありません。詳細については、ドキュメントを参照してください。)これにより、コンテキストがディスクにフラッシュバックされるまで削除が延期されます。これは大きな問題ではありません。 。willSaveNSManagedObject willSave

最後の人が離れた瞬間に部門が自分自身を削除する必要がある場合は、部門エンティティにKVOで自分自身を監視してもらいます。との独自の「person」プロパティでオブザーバーとして登録しawakeFromFetchawakeFromInsertで登録を解除しwillTurnIntoFaultます。人物のプロパティが変更されたら、空かどうかを確認します。これはより多くの作業なので、最初の方法がうまくいかない場合にのみ試してください。

最後に、Person-> Department関係の削除ルールは、「アクションなし」(Personが削除された場合はユーザーがクリーニングの責任を負う)ではなく、「nullify」(Personが削除されるとDepartmentのpersonsから削除される)に設定する必要があることに注意してください。自分で部門をアップ)または「カスケード」(人が削除されると、その部門も削除されます!)

(* MOGeneratorは、エンティティごとのクラスを維持するための非常に優れたヘルパーです。http: //rentzsch.github.com/mogenerator/

于 2011-02-13T06:39:08.850 に答える
2

Personサブクラスで、をオーバーライドしますprepareForDeletionDepartmentが1つしか残っていない場合はperson、それも削除しDepartmentます。AppleのドキュメントではprepareForDeletion、カスタム削除の伝播を行うのに最適な場所として使用することも提案されています。

- (void)prepareForDeletion
{
    [super prepareForDeletion];

    if (self.department.persons.count == 1) {
        [self.managedObjectContext deleteObject:self.department];
    }
}
于 2013-02-20T05:04:17.550 に答える