2009-08-19 31 views
26

Tôi có hai mô hình Bộ phận và Người lao động. Sở có nhiều mối quan hệ (công nhân) cho người lao động. Công nhân có trường firstName. Làm cách nào để tôi có được danh sách công nhân được sắp xếp theo firstName bằng cách truy cập departmet.workers? Có cách nào để thêm các bộ mô tả sắp xếp trong mối quan hệ nhiều-nhiều không?Sắp xếp theo mối quan hệ khác nhau Đặt trong dữ liệu lõi

+1

nó một chủ đề cũ .. Nhưng nó làm việc và giúp tôi thời gian lớn! Đặt điểm đánh dấu chủ đề này Cảm ơn tất cả .. !! – Shailesh

Trả lời

7

Các mối quan hệ nhiều trong Dữ liệu chính được mô hình hóa dưới dạng tập hợp không theo thứ tự. Tuy nhiên, bạn có thể tạo thuộc tính được tìm nạp trên thực thể Bộ bao gồm bộ mô tả sắp xếp hoặc bạn có thể sắp xếp bộ nhớ trong ứng dụng của mình (NSArrayController sẽ thực hiện việc này cho bạn bằng cách đặt thuộc tính sortDescriptors).

+2

Tôi muốn bỏ phiếu cho một thuộc tính được tìm nạp vì nó có vẻ là "cách tự nhiên nhất" trong Dữ liệu cốt lõi. –

+1

@BarryWark Tôi đồng ý với Karsten, nhưng tôi nghĩ sẽ tốt hơn nếu bạn đưa vào một số chi tiết về cách tạo bộ mô tả.Sau một chút tìm kiếm trên google tôi vẫn chưa tìm thấy cách làm mô tả "sắp xếp" trong thuộc tính đã tìm nạp, chỉ cách đối sánh các truy vấn kiểu. – csga5000

+0

Vui lòng cung cấp ví dụ – MobileMon

2

Bạn cần xác định phương thức của riêng mình, chẳng hạn như SortWorkers. Một cái gì đó như thế này:

- (NSArray *)sortedWorkers { 
    NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease]; 
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease]; 

    return [self.workers sortedArrayUsingDescriptors:sortDescriptors]; 
} 
3

đang snip Hunter và gần như đã làm việc cho tôi, ngoại trừ từ "công nhân" là một NSSet, tôi phải tải nó thành một NSMutableArray đầu tiên:

- (NSArray *)sortedWorkers { 
    NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease]; 
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease]; 

    NSMutableArray *sortThese = [NSMutableArray arrayWithCapacity:[self.workers count]]; 
    for (id worker in self.workers) { 
     [sortThese addObject:worker]; 
    } 

    return [sortThese sortedArrayUsingDescriptors:sortDescriptors]; 
} 
31

cải thiện nhẹ so với Adrian Hosey của mã:

Thay vì bằng tay iterating trên tất cả công nhân bạn cũng có thể chỉ cần làm:

-(NSArray *)sortedWorkers { 
    NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease]; 
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease]; 

    return [self.workers sortedArrayUsingDescriptors:sortDescriptors]; 
} 

Có thể thực hiện chính xác điều tương tự như sự lặp lại của bạn trong nội bộ, nhưng có lẽ chúng làm cho nó hiệu quả hơn bằng cách nào đó. Nó chắc chắn ít gõ ...

Lưu ý: ở trên chỉ hoạt động trên iOS 4.0+ và OSX 10.6+. Trong các phiên bản cũ hơn, bạn cần phải thay thế dòng cuối cùng với:

return [[self.workers allObjects] sortedArrayUsingDescriptors:sortDescriptors]; 
+3

Uhm, sắp xếp là O (n * log (n)), lặp lại là O (n). Trong khi điều này là ít mã, nó chắc chắn là chậm hơn. –

+1

Trong khi đúng, sự khác biệt giữa các đoạn mã không phải là một đoạn lặp và một loại. Cả hai đều sử dụng phương pháp sắp xếp, nó chỉ là Adrian đang sử dụng phương pháp [allObjects] để chuyển đổi thành một mảng chứ không phải xây dựng một cách thủ công bằng cách lặp lại trên tập hợp –

+4

Khi OS X 10.6 không lặp lại thủ công, cũng không phải '[allObjects] 'là cần thiết khi NSSet tự thực hiện' sortArrayUsingDescriptors: ', tiết kiệm sự tạo ra thừa của một NSArray tạm thời. – Regexident

1

Tôi nhận thấy rằng đây là khá cũ, nhưng mọi người vẫn sẽ đi qua nó (tôi đã làm) bài

Adrian Schönig là tốt. Tôi thấy nó hữu ích cho những điều cơ bản nhưng bạn phải làm điều này sắp xếp mỗi khi bạn muốn truy cập Set của người lao động. Điều này rất không hiệu quả!

Thay vào đó, tốt hơn là thực hiện sắp xếp mỗi khi bạn chèn một đối tượng mới và sau đó lưu nó làm Đặt trong CoreData. Điều này có nghĩa là mỗi khi bạn gọi CoreData, công nhân sẽ được đặt hàng.

Tôi đã làm điều này cho hệ thống của mình bằng cách sử dụng Danh mục cho NSManagedObject (Công nhân + Phương thức.h). Ở đây tôi có phương pháp init cho một Worker mới

// Worker+Methods.m 
+(Worker *)newWorkerWithFirstname:(NSString *)firstName department:(Department *)department managedContext:(NSManagedObjectContext *)context { 
    Worker *w = [NSEntityDescription insertNewObjectForEntityForName:@"Worker" inManagedObjectContext:context]; 
    w.firstName = firstName; 
    w.department = department; 

    [department orderWorkers]; 
    return s; 
} 


//Department+Methods.m 
-(void)orderServices { 
    NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease]; 
    self.workers = [[NSSet alloc] initWithArray:[self.workers sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortNameDescriptor]]]; 
} 

Rõ ràng điều này là không hiệu quả khi bạn thêm nhiều công nhân, nhưng bạn chỉ có thể di chuyển [bộ phận đơn hàng]; xảy ra sau khi tất cả các công nhân được thêm vào.

7

cải thiện nhẹ so với giải pháp Adrian Schönig của:

Bởi bây giờ nó là cần thiết để đúc self.workers để NSSet *

-(NSArray *)sortedWorkers { 
    NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease]; 
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease]; 

    return [(NSSet*)self.workers sortedArrayUsingDescriptors:sortDescriptors]; 
} 
Các vấn đề liên quan