2012-05-12 16 views
1

私は3つのエンティティオブジェクトを持っています。これらのエンティティの関係はちょっと愛の三角です!コアデータ削除アクションのカスタマイズ

Department <---->> Employee

Company <----->> Employee

は例を設定する(例えば。人事部は、すべての企業に共通している)

Company <<----->> Department(多くの多く)、

ジョン(employee1)に属しています Jason(従業員2)はIBC Compnayに所属し、Financeで働いています **注:マーケティングはbに共通していますothジョンとジェイソン。私は削除ルーチンを開発したかった

、このよう

deleting、その会社、私はまた、任意の `他のとび」の一部ではない部門を取り除きたいすべてのEmployees を削除します。 したがって、私はIBC会社を削除した場合、Jasonを削除する必要があります(私が推測するカスケード経由)。また、財務部門を持つ唯一の会社である場合にのみ財務部門を廃止します。 Finance.company == [zero result]がある場合は、何らかの形でそれを削除する必要があります。

DELETINGDEPARTMENTは前に選択した会社に所属するすべてのits Employees削除します!会社を想定し がaready選ばれた、私がいただきたいと私はdeparmentを削除する場合は、「、HRは、私も

私の質問がある選択した企業に属し、その部門内のすべての従業員を削除したいと思います言いますWHERE」私は、このような削除ルールを処理する必要があり、これは全体来て、それを処理する方法がわからないイム:必要なすべてを削除するかどうかをチェックし、削除を処理するための最も効率的な方法だろう何

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

上記のルールに基づいて、必要があります。

ご了承ください。おかげ

答えて

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]; 
    } 

`

フェッチ作成し、関係のデータモデルインスペクタで、削除指定できるルール:

enter image description here

しかし、あなたが言うことを始めたら、私は「従業員は仕事場で脚をしていますが、喫茶店では、大企業の社員が休暇を取っている場合を除き、削除する必要があります。コアデータ・プログラミング・ガイドから

関係

関係の削除規則は、試行がソースオブジェクトを削除するためになされた場合にどうするかを指定するルールを削除します。前の文章で "試行があれば..."と書いてあることに注意してください。リレーションシップの削除ルールが拒否に設定されている場合は、ソースオブジェクトが削除されない可能性があります。部門の従業員関係、および異なる削除ルールが持つ影響について再度検討してください。

拒否関係先に少なくとも一つのオブジェクトがある場合、ソース・オブジェクトは削除できません。 たとえば、部門を削除する場合は、その部門のすべての従業員が最初に他の部門に移管されていることを確認する必要があります。そうしないと、部門を削除できません。

Nullify

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

カスケード

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

アクションなし

リレーションシップ先のオブジェクトに対して何もしません。 たとえば、部門を削除する場合、その部署に属すると考えていても、すべての従業員をそのまま残します。

これらの規則の最初の3つは、さまざまな状況で役立つことは明らかです。どのような関係においても、ビジネスロジックによって最適なものを選択するのはあなた次第です。なぜなら、No Actionルールを使用する理由は、それを使用するとオブジェクトグラフを矛盾した状態(削除された部門との関係を持つ従業員)のままにする可能性があるからです。

No Actionルールを使用する場合は、オブジェクトグラフの一貫性が維持されることを確認する必要があります。意味のある値に反比例関係を設定するのはあなたの責任です。これは、対多の関係を持っている状況で有益であり得るとdestination.`で多数のオブジェクトがあるかもしれません

ソース:Core Data Programming Guide

+0

大丈夫、感謝の男は、それを得ました! '[CompanyObject removeDepartment::DepartmentObj] – jasonIM

+0

はこのようなクールな動きがあり、より多くの一つのことを求めることができる;' 部門<--->>従業員は、一から二 – jasonIM

+0

はもっと一つのことを頼むことができ、このようなクールな動きがあります: '[CompanyObject removeDepartment:DepartmentObj]; ' 部門はCompanyと多対多の関係を持っています したがって、[Department removeEmployees]と呼ぶことはできません。この場合、異なる会社の従業員を持つことができるので、FetchRequestと反復だけが出ていますか? 配列{ ([department.employees]の従業員){ if(employee.forCompany === {この会社}) [managedContext:deleteObject:employee]; } ' 私はこれが道です。 – jasonIM

関連する問題