2012-03-29 41 views
5

Tôi đang gặp một chút rắc rối khi nắm bắt các mối quan hệ CoreData, tôi lưu ý rằng tôi nên sử dụng loại mối quan hệ nào giữa 2 thực thể của mình hoặc nếu logic của tôi là chính xác.Quan hệ CoreData giữa các thực thể và thuộc tính

1) "Person" Entity - thuộc tính như tên, số điện thoại, địa chỉ, quốc gia, vv ...

2) "CountryList" - các thuộc tính như COUNTRYNAME countryLat, countryLong, vv ..

Thực thể CountryList được điền trước vào lần chạy đầu tiên của ứng dụng để bao gồm tất cả các quốc gia trên thế giới và dữ liệu được tôn trọng của chúng.

Trường hợp tôi bị kẹt là tôi có cần mối quan hệ giữa hai thực thể này không?

Tôi sẽ cho phép người dùng chọn quốc gia từ dữ liệu thực thể CountryList và muốn lưu trữ lựa chọn đó trong thuộc tính quốc gia cho thực thể Person.

Tôi có lấy tên quốc gia từ CountryList làm chuỗi và lưu trữ trong quốc gia từ Người không? hoặc tôi có thể tạo mối quan hệ giữa họ?

Tôi biết người dùng chỉ có thể thuộc về 1 quốc gia nhưng một quốc gia có thể có nhiều người dùng vì vậy đây có phải là mối quan hệ một đến nhiều không? Hoặc có quá nhiều người vì nhiều người dùng có thể thuộc về một quốc gia nhưng một quốc gia có thể có nhiều người dùng? Bối rối!

Có thể ai đó hãy khai sáng cho tôi về điều này và chỉ cho tôi đúng hướng trong những gì tôi nên làm trong xcode.

Nhiều Cảm ơn trước Matt

EDIT: Đây có phải là đúng?

Tôi đã thực hiện thay đổi đối với Tên thực thể v.v ... và nghĩ rằng bây giờ tôi có mối quan hệ được đặt chính xác.

Xcode Screenshot

EDIT 2: attribute nước Removed và đổi tên các mối quan hệ

Xcode Screenshot

+0

Nếu bạn đang bối rối như thế nào để thực hiện các mối quan hệ cho tôi biết .. tôi hiện đang làm việc trên Core dữ liệu chỉ và đã làm tất cả những thứ này .. vì vậy, luôn sẵn lòng giúp đỡ .. :-)) –

+0

Có vẻ tốt, nhưng như tôi đã nói, hãy đổi tên các mối quan hệ. Ngoài ra, bạn sẽ không cần thuộc tính "quốc gia" trong "Người" nữa – JiaYow

Trả lời

5

Thứ nhất, "CountryList" của bạn thực thể nên được gọi là "Quốc gia", vì nó đại diện duy nhất một nước. Thực tế là bạn có nhiều quốc gia đó không liên quan gì đến tên của nó.

Sau đó, có vẻ như tự nhiên khi sử dụng mối quan hệ, một "Người" có một "Quốc gia", nhưng một quốc gia có thể có nhiều người. Do đó, mối quan hệ một-nhiều. Sử dụng mối quan hệ sẽ đơn giản hóa nhiều hoạt động bạn có thể muốn thực hiện (tức là truy cập tất cả thông tin quốc gia của một người hoặc nhận danh sách tất cả những người ở một quốc gia cụ thể).

Ồ, và điều này có thể giúp bạn hiểu mối quan hệ tốt hơn một chút: Không có mối quan hệ "nhiều - nhiều" trong CoreData. Bạn luôn định nghĩa một mối quan hệ từ một nguồn đến một đích. Vì vậy, nếu bạn định nghĩa một mối quan hệ từ Quốc gia thành Người, thì đây sẽ là mối quan hệ một-nhiều. Một quốc gia, nhiều người. Sau đó, bạn có thể định nghĩa mối quan hệ từ Person thành Country, đó sẽ là mối quan hệ một-một. Một người, một quốc gia. Nếu bạn định nghĩa điều này như một mối quan hệ một-nhiều, bạn sẽ kết thúc với một mối quan hệ rất nhiều trên thực tế (bởi vì trên người có thể có nhiều quốc gia và một quốc gia có thể có nhiều người). Nó không phức tạp như nó xuất hiện.

Bây giờ, sau khi bạn đã xác định hai mối quan hệ của mình, bạn có thể đặt chúng là "Mối quan hệ nghịch đảo" với nhau. Làm điều đó cho một trong các mối quan hệ, một trong những mối quan hệ khác sẽ được thiết lập tự động. Sau khi bạn đã làm điều đó, CoreData sẽ ví dụ như cập nhật quốc gia của một người khi bạn thêm người đó vào danh sách của quốc gia đó.

Xem https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html để biết thêm thông tin.

+0

Vui lòng xem câu trả lời của tôi và vui lòng nhắc nếu đề xuất của tôi sai. –

+0

@JiaYow Rất cám ơn, tôi nghĩ đây là nơi tôi đang nghĩ một chút nhầm lẫn về CoreData giống như một cơ sở dữ liệu và các thực thể giả định giống như các bảng. Mà tôi biết không phải là trường hợp, nhưng khó tìm thấy nó khó để nghĩ khác đi. Vì vậy, trong xcode tôi chọn thực thể Person và tạo mối quan hệ countryRel và sau đó chọn Country entity và tạo personRel và thiết lập Inverse của họ. Sau đó chọn mối quan hệ personRel trong mục Country và chọn To-Many Relationship? Tôi nghĩ điều này có vẻ đúng. –

+0

Yup. Nhưng bỏ qua phần "Rel". Gọi mối quan hệ "quốc gia" và "người" (bạn sẽ có nhiều người, do đó số nhiều) tương ứng. Nó trực quan hơn nhiều để sử dụng – JiaYow

0

CountryList nên chỉ được Country

Sau đó, bạn thiết lập một 'nhiều đến một' mối quan hệ giữa Person.county và Country

0

Bạn đang sử dụng Core Data, do đó bạn phải xác định mối quan hệ giữa PersonCountry nếu bạn muốn để tìm nạp quốc gia của người đó từ cơ sở dữ liệu.

Và trong mối quan hệ này, bạn có thể có mối quan hệ 1-1. Vì một người sẽ chỉ thuộc về một quốc gia. Tất nhiên, một quốc gia sẽ có nhiều người nhưng trừ khi bạn muốn hiển thị tất cả mọi người liên quan đến quốc gia cụ thể, bạn không cần một mối quan hệ nào với nhiều mối quan hệ ..

Trong trường hợp bạn muốn thực hiện liên kết một đến nhiều this bạn đã hiểu một đến nhiều mối quan hệ ..

http://www.theappcodeblog.com/2011/09/29/iphone-app-development-tutorial-core-data-part-2-one-to-many-relationship/

+0

Hãy nhắc tôi nếu tôi nhầm lẫn .. –

+1

Lưu ý rằng điều này đúng với mối quan hệ Người-> Quốc gia, không phải cho Quốc gia-> Người (nếu anh ta muốn điều đó) – JiaYow

+0

@JiaYow: Vâng đó là những gì tôi đã cố gắng nói nhưng Tôi giải thích nó bằng ngôn ngữ ít khó khăn .. Cảm ơn bạn thân .. :-)) –

Các vấn đề liên quan