2012-09-06 13 views
8

enter image description here - Tôi có một thực thể Item Thực thể và Tag Thực thể. - Các mục có thể có nhiều Thẻ và Thẻ có thể được liên kết với nhiều mục (nhiều đến nhiều mối quan hệ). - Mối quan hệ là "Mối quan hệ đặt hàng" (sử dụng mối quan hệ đặt hàng trong IOS5) theo cả hai cách.Dữ liệu cốt lõi: Tôi nên sử dụng gì làm Trình mô tả sắp xếp với tập hợp đặt hàng (ios5) trong mối quan hệ nhiều đến nhiều

Tôi muốn lấy tất cả các thẻ con cho một mục nhất

Im bằng cách sử dụng sau đây lấy yêu cầu:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; 

// Fetch all items that have a given tag 
Tag* myTag = ....; 
request.predicate = [NSPredicate predicateWithFormat:@"ANY tag == %@", myTag]; 

// This is my attempt to get the correct sort ordering (it crashes) 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"tag" 
                   ascending:YES]; 
request.sortDescriptors = @[sortDescriptor]; 

Các loại trên lợi nhuận mô tả dữ liệu (mà tôi giả định là trong một số thứ tự) nhưng sau đó crashes:

[_NSFaultingMutableOrderedSet compare:]: unrecognized selector sent to instance 0x10b058f0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[_NSFaultingMutableOrderedSet compare:]: unrecognised selector sent to instance 0x10b058f0' 

Nếu tôi đưa ra một mảng mô tả sắp xếp trống thì tôi không bị lỗi nhưng kết quả không được đặt hàng.

Làm cách nào để triển khai chính xác bộ mô tả sắp xếp theo quan hệ nhiều đến nhiều bằng cách sử dụng tính năng quan hệ đặt hàng trong ios5?

+0

Bạn có thể làm rõ những thực thể bạn đang tìm nạp các trường hợp không? Nếu bạn đang tìm nạp các trường hợp của 'Item', thì bộ mô tả sắp xếp là xác định thứ tự sắp xếp của' Item 'và không liên quan gì đến mối quan hệ đã sắp xếp' Item' có 'Tag'. Ngoại lệ được gây ra bởi vì keyPath của bạn không kết thúc trong một thuộc tính mà là một tập hợp. Thay vào đó, hãy thử 'thẻ. @ Count'. –

+1

Tôi có một truy vấn tương tự. Trong trường hợp này, tôi đang tìm tất cả các mục được liên kết với Tag (tìm nạp yêu cầu về thực thể Item) và vì Tag to Item là một mối quan hệ có trật tự, tôi muốn tìm kiếm các Item được liên kết với Thẻ "theo thứ tự" nó được lưu trong cơ sở dữ liệu. Coredata không trưng ra bảng trung gian được sử dụng để duy trì mối quan hệ được sắp xếp, vì vậy làm thế nào để xác định rằng trong NSFetchedResultsController? – siasl

+0

Tôi đang cố gắng tìm nạp tất cả các trường hợp Các mục được liên kết với ý định Thẻ theo thứ tự được lưu. Tôi đang in ra các truy vấn sql để bàn điều khiển và nếu tôi sử dụng thẻ như mô tả sắp xếp, tôi có thể thấy kết quả được đặt hàng bởi một bảng trung gian, tuy nhiên đây là nội bộ để dữ liệu cốt lõi. Có anyway để xác định thứ tự này bằng cách sử dụng bộ mô tả sắp xếp? CHỌN DISTINCT 0, t0.Z_PK TỪ ZKDITEM t0 THAM GIA Z_2TAGS t1 ON t0.Z_PK = t1.Z_2ITEMS WHERE t1.Z_4TAGS =? ORDER BY t1.Z_FOK_2ITEMS – Ash

Trả lời

15

Tôi nghĩ bạn có thể hiểu sai mối quan hệ đặt hàng có nghĩa là gì trong Dữ liệu chính. Theo this question, "đã đặt hàng" không có nghĩa là "liên quan đến một số tài sản" - thay vào đó, "đặt hàng" có nghĩa là "giữ nguyên thứ tự của người dùng" (hoặc một thứ tự cụ thể khác có thể tùy ý). Một số ví dụ:

  • Một lệnh mối quan hệ sẽ là tốt cho các bước trong một công thức (ví dụ từ Core Data Release Notes của Apple) - các bước có thể không nhất thiết phải được đặt hàng đối với bất kỳ tài sản của họ với (ví dụ như văn bản của họ), và sẽ phải duy trì một thuộc tính "chỉ mục" hoặc "thứ tự" nếu thuộc tính của chính chúng nếu Core Data không thực hiện thứ tự.
  • Mối quan hệ đặt hàng sẽ không phải là phù hợp với danh sách tên - người dùng có thể chọn sắp xếp theo tên hoặc họ, chẳng hạn như bộ sưu tập tên không có thứ tự nội tại thực sự. Điều duy nhất quan trọng là thứ tự hiển thị - bản thân dữ liệu không cần phải duy trì thứ tự đó. (Nguyên tắc hàng đầu trong tài liệu của Apple là nếu một người dùng hình dung có thể lựa chọn giữa specifiers loại, mối quan hệ nên không được sắp xếp theo Core Data.)

Trong trường hợp của bạn, bạn cố gắng áp dụng một loại bộ mô tả cho tập hợp số được đặt hàng (giá trị cho thuộc tính tags) mà bạn đang tìm nạp. Đây là nguyên nhân gây ra sự cố của bạn - lớp con NSOrderedSet (_NSFaultingMutableOrderedSet, trong trường hợp của bạn) không thực hiện phương thức -compare: mà bộ mô tả sắp xếp sẽ sử dụng để sắp xếp chúng và vì vậy bạn có ngoại lệ đó.

Tôi nghĩ rằng một giải pháp tốt cho bạn sẽ là không sử dụng một bộ mô tả sắp xếp ở tất cả; thay vào đó, nếu bạn muốn thay đổi thứ tự được bảo quản để hiển thị cho người dùng, hãy nhận giá trị NSOrderedSet cho tags trên một số Mặt hàng, sau đó lấy một mảng ra khỏi nó bằng cách sắp xếp của riêng bạn bằng cách sử dụng -sortedArrayUsingComparator:. Điều này sẽ giữ dữ liệu theo thứ tự đúng trong Dữ liệu cốt lõi nhưng cho phép bạn tự sắp xếp lại dữ liệu theo chương trình.

Ở cấp độ cao hơn, bạn cũng có thể muốn cân nhắc xem bạn có thực sự cần đơn đặt hàng trong mối quan hệ của mình hay không. Nó phải chịu một hình phạt hiệu suất đáng kể, và tất cả những gì bạn thực sự lấy lại là thứ tự ban đầu trong đó các thẻ được thêm vào các mục (hoặc ngược lại).Nếu bạn dự định thay đổi thứ tự đó mỗi khi bạn hiển thị thẻ, thì bạn sẽ nhận được hiệu suất đó không có lợi ích thực sự - làm cho các mối quan hệ của bạn bị sắp xếp, sau đó tiếp tục sắp xếp theo lập trình hoặc sử dụng bộ mô tả sắp xếp trên khóa tổng hợp, chẳng hạn như [email protected] , như được đề xuất trong các ý kiến.

+0

Đây là một lời giải thích tuyệt vời. – mkral

+0

Cảm ơn! Tôi đánh giá cao nó. – Tim