1

3 つのエンティティ オブジェクトがあります。これらのエンティティ間の関係は、ちょっとした三角関係です!

Company <<----->> Department(多対多)(例:人事部は全社共通)

Department <---->> Employee

Company <----->> Employee

例を設定するには、

John (employee1) は BSKYU Company に所属し、Marketing で働いています) Jason (employee2) は IBC Compnay に所属し、Finance で働いています) **注: マーケティングは John と Jason の両方に共通です。

私は、次のような削除ルーチンを開発したかったのです。

deleting 会社はそのすべてを削除しますEmployees 私はまた、「その他の会社」の一部ではない部門を削除したいと考えています。したがって、IBC会社を削除すると、ジェイソンを削除し(カスケード経由で推測)、IBCが財務部門を持つ唯一の会社である場合にのみ財務部門を削除する必要があります。Finance.company == [ゼロの結果] であるかどうかを確認する必要がある場合は、削除してください。

DELETINGDEPARTMENTits Employeesは、以前に選択された A Company に属するものをすべて削除します。会社がすでに選択されていると仮定すると、人事部などの部署を削除する場合、選択した会社に所属するその部署内のすべての従業員も削除したいと思います

私の質問は、「どこで」そのような削除ルールを処理する必要があるかということです。これは出くわしますが、それを処理する方法がわかりません:

- (BOOL)validateForDelete:(NSError **)error

上記のルールに基づいて削除する必要があるすべてのものを削除する必要があるかどうかを確認して、削除を処理する最も効率的な方法は何でしょうか。

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

1

適切な述語を使用して自分で行う必要があります。開始点として以下のサンプル コードを使用できますが、コンテキスト、述語などを提供する必要があります。

削除ルールはデータの整合性を確保するのに便利ですが、特殊なケースがある場合は、オブジェクトを取得して手動で削除する必要があります。

/// 取得リクエストを作成

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
[request setEntity:entity]; 

// Ignore property values for maximum performance
[request setIncludesPropertyValues:NO];

// If a predicate was specified then use it in the request
if (predicate != nil)
    [request setPredicate:predicate];

// Execute the count request
NSError *error = nil;
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];

// Delete the objects returned if the results weren't nil
if (fetchResults != nil) {
    for (NSManagedObject *manObj in fetchResults) {
        [managedObjectContext deleteObject:manObj];
    }

`

これとは別に、リレーションシップのデータモデル インスペクターで、削除ルールを指定できます。

ここに画像の説明を入力

しかし、あなたが言い始めたら、「従業員が職場で片足でコーヒールームにいて、大ボスが休暇中の場合を除いて、それをコーディングする必要がある場合にのみ削除してほしい.

コア データ プログラミング ガイドから:

関係削除規則

リレーションシップの削除規則は、ソース オブジェクトを削除しようとした場合にどうするかを指定します。前の文の言い回しに注意してください—「試みが行われた場合…」. リレーションシップの削除規則が [拒否] に設定されている場合、ソース オブジェクトが削除されない可能性があります。部門の従業員の関係と、さまざまな削除ルールが与える影響をもう一度考えてみましょう。

拒否

リレーション先に少なくとも 1 つのオブジェクトがある場合、ソース オブジェクトは削除できません。たとえば、部門を削除したい場合、その部門のすべての従業員が最初に別の場所に移動 (または解雇) されていることを確認する必要があります。そうしないと、部門を削除できません。

無効化

宛先のオブジェクトの逆関係を null に設定します。たとえば、部門を削除する場合は、現在のすべてのメンバーの部門を null に設定します。これは、従業員の部門関係がオプションである場合、または次の保存操作の前に各従業員に新しい部門を確実に設定する場合にのみ意味があります。

カスケード

リレーション先のオブジェクトを削除します。たとえば、部門を削除する場合は、その部門のすべての従業員を同時に解雇します。

何もしない

リレーションシップの宛先にあるオブジェクトには何もしません。たとえば、ある部門を削除する場合、従業員がその部門に属していると信じている場合でも、すべての従業員をそのままにしておきます。

これらのルールの最初の 3 つがさまざまな状況で役立つことは明らかです。どの関係についても、ビジネス ロジックに応じて、最も適切なものを選択する必要があります。No Action ルールを使用すると、オブジェクト グラフが一貫性のない状態 (削除された部門との関係を持つ従業員) のままになる可能性があるため、なぜ No Action ルールが使用されるのかは明らかではありません。

No Action ルールを使用する場合、オブジェクト グラフの一貫性を維持するのはユーザー次第です。逆の関係を意味のある値に設定する責任があります。これは、対多の関係があり、宛先に多数のオブジェクトがある可能性がある状況で役立つ場合があります。

ソース:コア データ プログラミング ガイド

于 2012-05-12T14:53:25.060 に答える