2011-02-06 49 views
12

Tôi đang viết một ứng dụng iOS có lưu trữ hồ sơ cá nhân và cần hiển thị danh sách được sắp xếp theo những cách cụ thể. Có một số biến số của các thứ tự này, và chúng được tạo ra khi đang bay, nhưng tôi muốn chúng được lưu trữ trong kho dữ liệu. Cách SQL để làm điều này là để có một bảng ListPositions với một tên danh sách, một id vào bảng người, và một khóa sắp xếp. Sau đó, để hiển thị một danh sách cụ thể, tôi có thể chọn tất cả danh sách ListPositions với một tên đã cho, kéo vào những người được tham chiếu và sắp xếp trên khóa sắp xếp. Đang cố gắng làm điều này trong CoreDatat, tuy nhiên tôi gặp phải vấn đề. Tôi cố gắng để thực hiện điều này bằng cách sử dụng sơ đồ như:CoreData sắp xếp theo mối quan hệ nhiều-nhiều

Person: 
    Name 
    DOB 
    etc... 
    positions -->> ListPosition 

ListPosition: 
    listName 
    sortKey 
    person --> Person 

Sau đó, tôi có thể nhận được tất cả những người trong danh sách đưa ra với NSPredicate [NSPredicate predicateWithFormat:@"ANY positions.listName like %@", someList]; này cho phép tôi để tự động thêm danh mục này dựa một tập hợp lớn giữa Ba Ngôi. Vấn đề là tôi không thể sử dụng trường sortKey của ListPosition để sắp xếp các Persons. Những gì NSSortDescriptor sẽ làm điều này? Và nếu không thể sắp xếp tìm nạp trên thuộc tính của một phần tử của một mối quan hệ nhiều, thì cách khác để nhận được nhiều thứ tự động, trong thứ tự coredata là gì? Tôi đang hiển thị danh sách với một NSFetchedResultsController, vì vậy tôi không thể đặt các danh sách với nhau trong bộ nhớ. Tôi cần làm điều đó với một NSFetchRequest.

+0

một số định dạng đẹp hơn sẽ dễ dàng hơn khi đọc câu hỏi ur. – vikingosegundo

+0

cung cấp cho chúng tôi mã ur! – vikingosegundo

Trả lời

3

Bạn nói đúng-- sau một mối quan hệ nhiều người trả về một NSSet, không có phân loại cố hữu. Để có kết quả được sắp xếp, có một vài tùy chọn:

  1. Giả sử rằng Person/ListPosition là mối quan hệ hai chiều, thực hiện yêu cầu tìm nạp mới cho thực thể ListPosition. Đặt đối sánh vị từ trên mối quan hệ "người" từ ListPosition, trông giống như [NSPredicate predicateWithFormat:@"person=%@", myPerson]. Sử dụng bất kỳ bộ mô tả sắp xếp nào bạn cần trên yêu cầu tìm nạp.
  2. Theo dõi mối quan hệ như bạn đang thực hiện, cung cấp cho bạn NSSet. Sau đó sử dụng phương thức -sortedArrayUsingDescriptors: của NSSet để chuyển đổi nó thành một mảng được sắp xếp.
+0

Tôi không rõ ràng. Vấn đề của tôi không phải là cách sắp xếp các đối tượng trong một mối quan hệ nhiều-nhiều, mà là cách cung cấp nhiều thứ tự sắp xếp khác nhau cho một tập hợp lớn các đối tượng. Tôi đã chỉnh sửa câu hỏi. – wombat57

1

Tôi nghĩ cách tiếp cận tốt nhất trong trường hợp này là tìm nạp thực thể ListPosition thay thế. Thêm bộ mô tả sắp xếp cho sortKey (nó sẽ hoạt động trong trường hợp này vì yêu cầu tìm nạp là trên thực thể ListPosition) và tìm nạp trước Person được liên kết với tên danh sách bằng cách sử dụng setRelationshipKeyPathsForPrefetching cho "person" trên yêu cầu tìm nạp.

[NSPredicate predicateWithFormat:@"listName like %@", someList]; 
+0

Điều này hoạt động, tuy nhiên nếu bạn thực hiện bất kỳ chỉnh sửa đối tượng Person, nó sẽ không kích hoạt NSFetchedResultsController để cập nhật vì ListPosition không thay đổi. –

1

Nếu tôi hiểu mô hình của bạn một cách chính xác, mỗi Person có một ListPosition cho mỗi danh sách, trong đó nó tham gia. Giả sử chúng ta có danh sách acsending theo tên của chúng, vì vậy X người có vị trí danh sách X với cùng mộtlistNamesortKey.

Tôi sẽ tạo đối tượng List, có chứa thuộc tính sortKey và sau đó sử dụng thuộc tính này trong bộ mô tả sắp xếp.

entity List: 
    - sortKey : string 
    - ascending : bool 

Tạo mô tả sắp xếp và sử dụng nó trong lấy yêu cầu:

[NSSortDescriptor sortDescriptorWithKey:chosenList.sortKey ascending:chosenList.ascending]; 

Sau đó, bạn có thể có nhiều danh sách như bạn muốn và bạn có thể dễ dàng sử dụng chìa khóa phân loại của nó để sắp xếp tất cả mọi người.


Nếu bạn muốn lưu trữ các vị trí trong cơ sở dữ liệu (bạn không đề cập đến thuộc tính index trong ListPosition của bạn, hoặc bất cứ điều gì tương tự), bạn có thể tạo ra “thực thể doanh”:

entity PersonInList: 
    - index : integer 
    - person -> Person 
    - list –> List 

ý tưởng khác đang có bộ đơn đặt hàng của Person đối tượng trực tiếp trong thực thể List.

0

Tôi thường thêm trường chỉ mục (loại NSNumber) vào một thực thể. Nó rất dễ dàng để tính toán chỉ mục trong việc thêm mục. chỉ bằng

object.index = person.positions.count 

vì vậy, thực sự bạn không cần trường vị trí nhưng mối quan hệ vị trí. kết nối thực thể người với thực thể ListPosition sẽ là đủ.

1

Lấy ListPosition (nó sẽ đến như một NSMutableSet). Sau đó, thực hiện sắp xếp trên Nhóm, như sau:

NSMutableSet *positionsSet = [personEntity mutableSetValueForKey:@"positions"]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"yourSortKey" ascending:NO]; 
NSArray *positionsSortedSet = [positionsSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

Điều đó sẽ cung cấp cho bạn một mảng được sắp xếp theo khóa của bạn.

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