2013-07-29 16 views
5

NSOrderedSets lưu thứ tự của các đối tượng trong bảng. Nếu bạn truy cập một cá thể lớp con NSManagedObject với một thuộc tính là một NSOrderedSet, thì chúng sẽ theo thứ tự.Cách sắp xếp kết quả của NSFetchedResultsController bằng cách sử dụng thứ tự của NSOrderedSet

Tuy nhiên, dường như không có cách nào để truy cập vào đơn đặt hàng đó bằng cách sử dụng NSSortDescriptor khi tạo NSFetchRequest.

Nó xuất hiện từ DB SQLite thô, thứ tự đó được lưu trữ trong các trường có tên Z_FOK_<relationship name>. Dữ liệu có sẵn, nhưng dữ liệu dường như không hiển thị thông qua các API dữ liệu cốt lõi.

Có ai biết cách viết NSSortDescriptor sẽ làm việc với DB SQLite để trả về kết quả theo thứ tự được chỉ định bởi NSOrderedSet không?


Cập nhật

Câu hỏi liên quan: NSFetchedResultsController and NSOrderedSet relationships

Trả lời

3

Tôi không nghĩ rằng đó là có thể. "Thứ tự" được liên kết với mối quan hệ nhiều-nhiều từ một thực thể A đến một thực thể khác B, nó không phải là tài sản của thực thể đích B. Nhưng một bộ mô tả sắp xếp cho một yêu cầu tìm nạp dữ liệu lõi chỉ có thể sử dụng các thuộc tính (liên tục) của thực thể.

+1

Điều đó có vẻ là những gì tôi thấy quá ... Tôi chỉ không thể tin rằng không có một số hỗ trợ đặc biệt cho điều này trong NSSortDescriptor để NSFetchedResultsControllers có thể tận dụng thứ tự. Nếu không, các nhà phát triển vẫn cần phải thêm và quản lý theo cách thủ công thuộc tính "sortOrder" - điều này sẽ loại bỏ mục đích của NSOrderedSet. –

+0

@CoreyFloyd: Lưu ý rằng bạn có thể có hai mối quan hệ đã đặt hàng 'A1 <-->> B' và' A2 <-->> B' với các thứ tự hoàn toàn khác nhau của các đối tượng 'B', vì vậy" tìm nạp đối tượng B được sắp xếp theo mối quan hệ đã sắp xếp "sẽ là không rõ ràng. –

+0

NSFetchRequest phải được tạo bằng bộ mô tả sắp xếp. Nhưng nếu có một số cách để tạo nó mà không có một bộ mô tả sắp xếp (Sử dụng một thể loại, phân lớp, vv ...) có thể khi bạn thực hiện yêu cầu tìm nạp nó sẽ mặc định theo thứ tự NSOrderedSet. Nhiều khả năng nó sẽ chỉ là hành vi không xác định nhưng nó có thể đáng để bắn. –

0

Tôi đã thử tính năng này nhanh chóng ngay bây giờ và dường như nó có hiệu quả đối với tôi.

var sectionsExcludingEmpty: [SurveyAnswerSection] { 
    let fetchRequest: NSFetchRequest<SurveyAnswerSection> = NSFetchRequest.init(entityName: "SurveyAnswerSection") 
    fetchRequest.predicate = NSPredicate.init(format: "surveyAnswer == %@ AND hidden == FALSE", self) 
    fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ] 
    if let moc = self.managedObjectContext { 
     do { 
      let results = try moc.fetch(fetchRequest) 
      return results 
     } catch { 
      fatalError("Could not get sectionsExcludingEmpty: \(error)") 
     } 
    } else { 
     fatalError("Unable to get own managed object context") 
    } 
} 

Khi tôi bỏ lỡ dòng fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ], nó được đặt hàng dường như ngẫu nhiên, nhưng với dòng đã thêm nó được sắp xếp như mong đợi.

Trong trường hợp của tôi SurveyAnswerSection có mối quan hệ đặt hàng-nhiều với SurveyAnswer.