2010-12-12 11 views
5

Tôi có một nhóm các nghệ sĩ được lưu trữ trong CoreData và muốn sắp xếp chúng theo tên nhưng bỏ qua tiền tố "the". Vì vậy, ví dụ "The Beatles" sẽ được sắp xếp là "Beatles", giống như những gì iTunes/iPod làm.NSSortDescriptor để loại bỏ "tiền tố"

Vì vậy, tôi cố gắng thêm một thuộc tính tùy chỉnh cleanName để mô hình Artist của tôi vì vậy nó có thể được sử dụng để phân loại với:

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"cleanName" ascending:YES]; 

Đó rõ ràng là mang xuống ứng dụng như cleanName không phải là một tài sản của SQLEntity:

...keypath cleanName not found in entity <NSSQLEntity Artist id=1> 

Tôi biết tôi có thể lưu cleanName trong cửa hàng, nhưng dường như điều đó có vẻ sai với tôi. Một thuộc tính mới chỉ để có tên bị tước bỏ tiền tố "the"? Có thật không?

Vì vậy, thay vào đó, tôi đã cố gắng subclassing NSSortDescriptor với một compareObject tùy chỉnh: toObject: thực hiện:

- (NSComparisonResult)compareObject:(Artist*)artist1 toObject:(Artist*)artist2 { 

NSString *cleanString1 = [artist1.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist1.name length])]; 
NSString *cleanString2 = [artist2.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist2.name length])]; 

return [artist1.cleanName compare:artist2.cleanName options:NSCaseInsensitiveSearch]; 
} 

này hoạt động khi tôi thêm một nghệ sĩ mới, nói "The Beatles" đến cửa hàng của tôi. Nghệ sĩ được sắp xếp là "Beatles" và được hiển thị bên trong phần "B" của tôi. Nhưng ngay sau khi tôi bỏ ứng dụng và khởi chạy lại nó, tôi nhận được lỗi sau và tableview chỉ nằm rỗng:

sectionIndex A for Apparat 
sectionIndex B for Bonobo 
sectionIndex M for Misteur Valaire 
sectionIndex M for Moderat 
sectionIndex P for Paul Kalkbrenner 
sectionIndex R for Röyksopp 
sectionIndex B for The Beatles 
NSFetchedResultsController ERROR: The fetched object at index 6 has an out of order section name 'R. Objects must be sorted by section name' 

Như bạn có thể nhìn thấy từ những gì tôi đang đăng nhập, các đề mục cũng tốt (The Beatles 'tiêu đề phần là B, vì nó phải là). Nhưng việc phân loại bị phá vỡ, vì bản ghi này phải ở ngay trước "Bonobo".

Bất kỳ ý tưởng nào về cách sửa lỗi này?

+0

Bạn đã triển khai * cleanName * như thế nào? Nó có vẻ như một tài sản tạm thời cho thực thể sẽ là con đường để đi. – Huperniketes

+0

Tôi khá chắc chắn các thuộc tính tạm thời không thể được sử dụng để sắp xếp trong NSFetchedResultsControllers. – samvermette

Trả lời

3

Sau khi trò chuyện với một vài người, có vẻ như việc lưu "cleanName" vào cơ sở dữ liệu là cách tốt nhất để đi và "bình thường hóa được ghi đè".

+1

Apple cũng đề xuất giải pháp này trong WWDC 2010 Phiên 118: Làm chủ dữ liệu cốt lõi –

+0

Điều cần biết. Cảm ơn bạn. – samvermette