2013-07-29 15 views
5

NSOrderedSets zapisać kolejność obiektów w tabeli. Jeśli uzyskasz dostęp do instancji klasy podrzędnej NSManagedObject z właściwością, która jest NSOrderedSet, wtedy będą one w porządku.Jak sortować wyniki w NSFetchedResultsController używając kolejności elementów NSOrderedSet

Istnieje jednak pozornie ma sposobu, aby uzyskać dostęp do zlecenia przy użyciu NSSortDescriptor podczas tworzenia NSFetchRequest.

Jak wynika z surowego SQLite DB, że zamówienie jest przechowywany w dziedzinach wymienionych Z_FOK_<relationship name>. Dane są dostępne, ale wydaje się, że nie są widoczne za pośrednictwem interfejsów API danych podstawowych.

Czy ktoś wie, jak napisać NSSortDescriptor, który będzie działał z SQLite DB, aby zwrócić wyniki w kolejności określonej przez NSOrderedSet?


Aktualizacja

Powiązane Pytanie: NSFetchedResultsController and NSOrderedSet relationships

Odpowiedz

3

Nie sądzę, że jest to możliwe. "Zlecenie" jest powiązane ze stosunkiem do wielu z jednego podmiotu A do innego podmiotu B, nie jest to właściwość jednostki docelowej B. Jednak deskryptor sortowania żądania pobrania danych podstawowych może używać tylko (trwałych) właściwości obiektu.

+1

To wydaje się być to, co widzę zbyt ... ja po prostu nie mogę uwierzyć, że nie jest pewne specjalne wsparcie na ten cel w NSSortDescriptor tak że NSFetchedResultsControllers mogą skorzystać z rzędu. W przeciwnym razie programiści nadal będą musieli dodawać i ręcznie zarządzać własnością "sortOrder" - która w pewnym stopniu eliminuje cel NSOrderedSet. –

+0

@CoreyFloyd: Zauważ, że możesz mieć dwa zamówione relacji 'A1 <-->> B' i' A2 <-->> B' z całkowicie różnych porządków tych 'obiektów B', więc„pobierania obiektów b posortowane według zamówionej relacji”byłoby niejednoznaczne. –

+0

NSFetchRequest należy utworzyć z deskryptorem sortowania. Ale jeśli istniał jakiś sposób na stworzenie go bez deskryptora sortowania (użycie kategorii, podklasy, itp.), Być może po wykonaniu żądania pobrania domyślnie byłby zleceniem NSOrderedSet. Najprawdopodobniej byłoby to nieokreślone zachowanie, ale warto byłoby spróbować. –

0

Próbowałem tego już teraz i wydawało mi się, że działa.

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") 
    } 
} 

Kiedy brakowało mi z linii fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ] to uporządkowaną pozornie losowo, ale dodaje, że linia sortowane zgodnie z oczekiwaniami.

W moim przypadku SurveyAnswerSection ma jeden do wielu relacji uporządkowane-z SurveyAnswer.

Powiązane problemy