2011-08-22 35 views
27

Tôi có một mối quan hệ cốt lõi dữ liệu giữa hai thực thể, mà là như thế này:CoreData xóa quy tắc nhầm lẫn, xcode

Entity A      Entity B 
aRelationship <-------------->> bRelationship 

Với sự cai trị xóa thiết lập để thác.

Có lẽ tôi có sai này, nhưng tôi nghĩ rằng nếu các quy tắc xóa cho cả hai mối quan hệ đã được thiết lập để "Cascade", sau đó khi đã làm như sau ...

[context deleteObject:EntityA]; 

... nó sẽ cũng xóa tất cả các thực thể B liên kết với nó. Tuy nhiên khi tôi đăng nhập tất cả các thực thể của tôi B của nó có vẻ như tôi nhầm.

Ai đó có thể làm sáng tỏ sự nhầm lẫn của tôi không?

Cảm ơn bạn rất nhiều.

Trả lời

90

trong khi nó không phải là ngay lập tức rõ ràng trong trình soạn thảo mô hình dữ liệu đồ họa từng mối quan hệ recipocal tức là mỗi

<--> 

... thực sự là hai mối quan hệ riêng biệt mỗi delet riêng của mình quy tắc điện tử. Quy tắc xóa được kích hoạt khi một đối tượng của thực thể có quy tắc xóa bị xóa.

Vì vậy, nếu trong trình soạn thảo mô hình dữ liệu bạn có hai thực thể AlphaBeta với một mối quan hệ:

Alpha.betas<-->>Beta.alpha 

... sau đó bạn thực sự có hai mối quan hệ như vậy:

Alpha.betas--(delete rule)-->>Beta.alpha 
Beta.alpha--(delete rule)-->Alpha.betas 

Bạn không bao giờ muốn thiết lập quy tắc xóa như sau:

Alpha.betas--(cascade)-->>Beta.alpha 
Beta.alpha--(cascade)-->Alpha.betas 

… vì xóa bất kỳ một trường hợp Beta sẽ xóa đối tượng Alpha liên kết sẽ kích hoạt việc xóa tất cả các đối tượng có liên quan Beta. Tùy thuộc vào các chi tiết của mô hình dữ liệu của bạn, một thác có đi có thể xóa một đoạn lớn dữ liệu của bạn một cách tình cờ.

gì bạn thực sự muốn là:

Alpha.betas--(cascade)-->>Beta.alpha 
Beta.alpha--(nullify)-->Alpha.betas 

Bây giờ, khi bạn xóa đối tượng Alpha, nó sẽ xóa tất cả liên quan đến Beta đối tượng.

Khi một thác bị chặn, thường là vấn đề với mối quan hệ được yêu cầu. Không thể nói chắc chắn mà không có chi tiết về mô hình dữ liệu.

+0

Câu hỏi nhanh, khi tôi chạy '[context deleteObject: EntityA];' điều này sẽ đảm bảo rằng tất cả các bản beta bị xóa ngay, nếu tôi có nó được thiết lập giống như bạn có trong mã snipit cuối cùng? –

+0

Giả sử không có thứ gì khác chặn việc xóa. – TechZen

+0

Nhưng nếu tôi xóa tất cả Betas thì sao? Làm thế nào để làm cho Alpha xóa tự động trong trường hợp như vậy? – shoumikhin

3

Tùy thuộc vào quy tắc xóa bạn đang sử dụng.

Đây là những gì Apple cho biết trong tài liệu của họ:

"Khi bạn xóa một đối tượng quản lý, điều quan trọng để xem xét mối quan hệ của mình là gì và đặc biệt là các quy tắc xóa định cho mối quan hệ Nếu tất cả các a. các quy tắc xóa mối quan hệ của đối tượng được quản lý là Nullify, sau đó đối với đối tượng đó ít nhất không có công việc bổ sung để thực hiện (bạn có thể phải xem xét các đối tượng khác tại địa chỉ của mối quan hệ đó - nếu mối quan hệ nghịch đảo là bắt buộc hoặc có giới hạn thấp hơn về cardinality, sau đó là e đích đối tượng hoặc đối tượng có thể ở trạng thái không hợp lệ). Nếu mối quan hệ quy tắc xóa là Cascade, thì việc xóa một đối tượng có thể dẫn đến việc xóa những người khác. Nếu quy tắc là Từ chối, sau đó trước khi bạn xóa đối tượng , bạn phải xóa đối tượng đích hoặc đối tượng khỏi mối quan hệ , nếu không bạn sẽ gặp phải lỗi xác thực khi lưu. Nếu một quy tắc xóa là Không hành động, sau đó bạn phải đảm bảo rằng bạn có bất cứ bước cần thiết để đảm bảo tính toàn vẹn của đồ thị đối tượng "

Các liên kết của‘Mối quan hệ Xóa quy’:.. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1