2012-05-12 23 views
1

我有三個實體對象。這些實體之間的關係有點像三角戀!自定義核心數據刪除操作

Company <<----->> Department(多對多)(例如,人力資源部通用於所有的公司)

Department <---->> Employee

Company <----->> Employee

以身作則,

約翰(employee1)屬於BSKYU公司和市場營銷部門) Jason(員工2)屬於IBC Compnay並在財務部門工作) **注意:市場營銷對於b約翰和傑森。

我想開發一個程序的缺失,使得

deleting公司將刪除其所有Employees 我也想擺脫不屬於任何其他`北美經銷商」的一部分,這個部門。 因此,如果我刪除IBC公司,它應該刪除賈森(通過級聯我猜),也擺脫財務部只有如果IBC是唯一的公司,有財務部。 我不知何故需要檢查如果Finance.company == [零結果],如果是這樣,刪除它。

DELETINGDEPARTMENT將刪除屬於這是之前選擇一家公司的所有its Employees! 假設公司AREADY選擇,我想,如果我刪除教研室,說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

但是如果你開始說,我wa只有當「員工在工作中,但在咖啡室裏,除非大老闆假期休假,那麼你必須對其進行編碼」,否則它將被刪除。

從核心數據編程指南:

關係刪除規則

的關係的刪除規則規定,如果試圖刪除源對象會發生什麼。請注意前面句子中的措辭 - 「如果嘗試......」。如果關係的刪除規則設置爲拒絕,則可能不會刪除源對象。再次考慮一個部門的員工關係,以及不同刪除規則的影響。

拒絕

如果存在所述至少一個對象的關係的目的地,則源對象不能被刪除。 例如,如果您要刪除某個部門,則必須確保該部門中的所有員工首先被轉移到其他地方(或被解僱!),否則該部門將無法刪除。

抵消

設置在目標對象爲空的反比關係。 例如,如果刪除某個部門,請將所有當前成員的部門設置爲空。這隻有在員工的部門關係是可選的,或者確保在下一次保存操作之前爲每個員工設置新部門時纔有意義。

級聯

刪除關係目的地的對象。 例如,如果您刪除某個部門,則同時啓動該部門中的所有員工。

無動作

對關係目的地的對象不做任何事情。 例如,如果您刪除了一個部門,即使他們仍然認爲他們屬於該部門,也會將所有員工保持原樣。

應該清楚的是,這些規則的前三條在不同的情況下是有用的。對於任何給定的關係,取決於業務邏輯,由您決定選擇哪個最合適。爲什麼No Action規則可能會被使用並不那麼明顯,因爲如果使用它,則可能會使對象圖形處於不一致狀態(員工與已刪除部門有關係)。

如果使用「無操作」規則,則確保維護對象圖的一致性由您決定。您有責任設置任何與有意義值相反的關係。這可能是在一個情況好處,你有一個一對多的關係,並有可能在destination.`

源是一個大數目:Core Data Programming Guide

+0

好,感謝的人,知道了! – jasonIM

+0

可以問一兩件事,是有一個很酷的舉動是這樣的: '[CompanyObject removeDepartment:DepartmentObj]' 部<--->>員工,一個個 – jasonIM

+0

可以問一兩件事,是有這樣一個很酷的舉動: '[CompanyObject removeDepartment:DepartmentObj];' 部門與公司有多對多的關係, 所以我不能直接打電話給[Department removeEmployees];因爲它可能有不同公司的員工,在這種情況下,FetchRequest和迭代是唯一的出路嗎? 如果(employee.forCompany === {this公司}) [managedContext:deleteObject:employee];({員工在[department.employees])中的{{ } { } }' 我是這種方式..出路! – jasonIM