2010-04-30 31 views
7

Làm cách nào để sử dụng NSFetchedResultsController với khóa sắp xếp đã dịch và sectionKeyPath?NSFetchedResultsController section localized được sắp xếp

Sự cố: Tôi có ID trong thuộc tính "loại" trong cơ sở dữ liệu như typeA, typeB, typeC, ... chứ không phải giá trị trực tiếp vì nó phải được bản địa hóa. Trong tiếng Anh typeA = Bird, typeB = Cat, typeC = Dog bằng tiếng Đức, nó sẽ là Vogel, Katze, Hund.

Với NSFetchedResultController với phím sắp xếp và sectionKeyPath vào "gõ" Tôi nhận được lệnh và phần - typeA - typeB - typeC

Tiếp theo tôi dịch cho hiển thị và mọi thứ đều tốt bằng tiếng Anh: - Bird - Cát - Chó

Bây giờ tôi chuyển sang Đức và nhận được một thứ tự sắp xếp sai - Vogel - Katze - Hund

bởi vì nó vẫn sắp xếp theo loạiA, typeB, typeC

Vì vậy, tôi đang tìm cách để bản địa hóa sắp xếp cho NSFetchedResultsController.

Tôi đã thử phương pháp thuộc tính tạm thời, nhưng cách này không hoạt động đối với khóa sắp xếp vì khóa sắp xếp cần phải nằm trong thực thể.

Tôi không có ý tưởng nào khác. Nhưng tôi không thể tin rằng đó là không thể sử dụng NSFetchedResultsController trên một thuộc tính có nguồn gốc cần thiết cho nội địa hóa?

Có các cuộc thảo luận liên quan như Using custom sections with NSFetchedResultsController? nhưng sự khác biệt là tên phần tùy chỉnh và khóa sắp xếp có thể có cùng thứ tự. Không phải trong trường hợp của tôi và đây là sự khác biệt chính.

Cuối cùng, tôi sẽ cần một thứ tự sắp xếp cho NSSortDescriptor cần thiết trên một thuộc tính có nguồn gốc, tôi đoán vậy. Thứ tự sắp xếp này cũng để phân phối cho sectionKeyPath.

Cảm ơn mọi gợi ý.

Trả lời

3

OK, không phải là một giải pháp tốt đẹp nhưng cuối cùng nó làm việc (vì tôi có một tập hạn chế được xác định hồ sơ CA. 100):

On intializing ứng dụng:

  • tôi tạo một thuộc tính "order by" trong đối tượng được quản lý.
    • Tôi kiểm tra xem bản địa hóa (và với thứ tự sắp xếp) đã thay đổi kể từ lần trước chưa. Nếu vậy:
    • Tôi tìm nạp tất cả các bản ghi và sắp xếp nó trong NSArray theo tên được bản địa hóa.
    • tôi viết lại các bản ghi trong các cửa hàng

Đối với Biến Lý do tôi chỉ lấy và sắp xếp hồ sơ theo một NSPredicate.

Hơn tôi có thể sử dụng tất cả mã hiện có bằng cách sử dụng "thứ tự theo" làm khóa sắp xếp và đường dẫn khóa phần.

Tôi biết rằng tôi có thể sử dụng mảng đã sắp xếp của mình làm nguồn dữ liệu cho chế độ xem bảng, nhưng tôi muốn giữ mã hiện tại và sử dụng các phương pháp của NSFetchedResultsController. Để thuận tiện cho việc này, tôi sẽ kiểm soát hoàn toàn việc sắp xếp, điều này sẽ phù hợp với nhu cầu của tôi trong tương lai vì tôi dự định xây dựng một thứ tự sắp xếp phức tạp hơn (dựa trên vị trí, xác suất sử dụng hồ sơ cao hơn ở trên cùng, v.v. .)

Tuy nhiên, đây không phải là giải pháp thanh lịch.

0

Cuối cùng, tôi sẽ cần thứ tự sắp xếp cho NSSortDescriptor cần thiết trên thuộc tính có nguồn gốc, tôi đoán vậy.

Đối với việc phân loại, một khả năng sẽ phải làm một cái gì đó như:

[NSSortDescriptor initWithKey:@"type" 
ascending:YES 
selector:@selector(translatedCompare:)] 

nơi translatedCompare là một phương pháp so sánh bạn viết (như một phạm trù trên NSString) mà localizes các giá trị trước khi so sánh chúng.

Không chắc chắn về cách xử lý sectionKeyPath.

+0

Có, tôi đã thử điều này đến một điểm nhất định. Nhưng thành thật mà nói, tôi đã không thể thuyết phục NSString bằng cách sử dụng phương pháp so sánh được xác định loại này .... Tôi đã không mong đợi sectionKeyPath là một vấn đề vì tôi có thể sử dụng thuộc tính tạm thời ở đây, phù hợp với thứ tự sắp xếp của sắp xếp cục bộ từ bộ mô tả sắp xếp. – Gerd

+0

Tôi đã thử một lần nữa. Vui lòng tham khảo câu trả lời "Tôi đã thử lại với tùy chỉnh so sánh ..." (Quá dài để nhận xét). – Gerd

0

Tôi đoán rằng sự cố là do bộ nhớ cache gây ra.

Bạn có thể đặt bộ nhớ cache với tên đã cho khi bạn tạo đối tượng NSFetchedResultsController bằng cách sử dụng phương pháp sau. Biến cuối cùng là tên bộ nhớ cache.

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name 

NSFetchedResultsController sử dụng bộ nhớ cache để tính toán các phần và đặt hàng nếu bộ nhớ cache có cùng tên tồn tại. Và bộ nhớ đệm được ghi trên đĩa (không phải bộ nhớ).

Vì vậy, nếu bạn thay đổi ngôn ngữ giữa tiếng Anh và tiếng Đức, bạn nên xóa bộ nhớ cache. Để xóa bộ nhớ cache, bạn có thể sử dụng phương thức lớp deleteCacheWithName:.

Bạn có thể tìm thông tin chi tiết tại đây. http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24

+0

Cảm ơn câu trả lời của bạn. Tôi đã thử điều này, nhưng không thấy sự khác biệt. Vấn đề không chỉ xảy ra khi chuyển từ ngôn ngữ này sang ngôn ngữ khác, nó cũng xảy ra nếu tôi ở trong một cài đặt ngôn ngữ. – Gerd

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