2010-12-08 26 views
3

J'ai actuellement une application Core Data soutenue par SQLite où je récupère les enregistrements triés sur firstName, puis lastName. Le problème est que j'ai quelques noms comme (John Doe) et ils reviennent en haut de la liste, il semble que le comportement de tri par défaut est fait dans l'ordre de tri ASCII.Données de base (tri SQLite) tri personnalisé des chaînes

Y at-il de toute façon forcer ces enregistrements à apparaître après Z?

J'ai lu à propos des descripteurs de tri personnalisés, mais ils ne semblent pas fonctionner, car les données de base reposent sur SQLite pour le tri.

Mise à jour

Voici une liste d'exemples de ce que mes données ressemble maintenant

(Abe Simpson) 
(Bob Dole) 
(Chris Rock) 
Alan West 
Brian Regan 

Ce que je veux qu'il ressemble

Alan West 
Brian Regan 
(Abe Simpson) 
(Bob Dole) 
(Chris Rock) 
+0

Qu'est-ce que vous voulez, besoin de mettre des documents à la fin forcément sans aucune base courte. Je ne pense pas que cela (John Doe) arrive enfin après z par le tri. – Ishu

Répondre

4

Ajouter un nouvel attribut appelé BOOL parenthesized, puis ...

- (void)setName:(NSString *)name 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:name]; 
    [self didChangeValueForKey:@"name"]; 
    self.parenthesized = ([name hasPrefix:@"("] && 
          [name hasSuffix:@")"]); 
} 

Et quand vous le rechercher:

[fetchRequest setSortDescriptors: 
[NSArray arrayWithObjects: 
    [NSSortDescriptor sortDescriptorWithKey:@"parenthesized" ascending:NO], 
    [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES], 
    nil]]; 
+0

Merci Daniel, cette approche a fonctionné parfait pour moi.Une note de côté pour quiconque regarde ceci dans le futur, si parenthésé est un ensemble BOOL croissant à YES dans le descripteur de tri pour qu'ils apparaissent au bas de la liste. –

0

-vous sur les classements personnalisés dans SQLite. Cependant, vous n'avez probablement pas accès à eux sur les i-devices.

+0

Il semble que Core Data n'autorise pas les classements personnalisés –

1

Quelle est la raison de la parenthèse? Vous pourriez probablement rendre les choses plus facile pour vous-même si vous remplacez ces informations implicites avec des informations explicites dans une propriété séparée qui peut ensuite être utilisé pour diriger le tri

+0

C'est comment un client stocke/segmente certaines de ses données (ce qui n'est pas une bonne approche), il est essentiellement hors de mon contrôle, mais dépouille les parenthèses qu'ils ne veulent pas. Je suppose que je pourrais ajouter une sorte de drapeau à l'enregistrement qui lui indique de montrer au bas de la liste ou quelque chose ... –

+0

En fait, les solutions Daniels semble bon, il vous donne le meilleur des deux mondes –

0

Je pense qu'il ya une réponse très simple/solution. Cela fonctionne pour moi localement (pas sur un iPhone). Après avoir relu votre article, vous vouliez qu'il soit au bas de la page. Ce qui précède les classerait comme si les parenthèses étaient ignorées. Ci-dessous obtiendrait la sortie que vous vouliez (bien que semble un peu hackish).

order by replace(firstName, '(','ZZZ') 
+0

jsuggs, je n'accède pas SQLite directement avec les instructions SQL, j'utilise Core Data pour gérer le chargement. Merci bien –

+0

Ahh, donc pas la possibilité d'envoyer un paramètre de tri? – jsuggs

+0

Malheureusement, pas de cette façon, du moins pas que je suis au courant. –

0

quand vous les données de base de données, vous obtenez un tableau arrière, trier le tableau en utilisant THE- (void) sortUsingSelector: méthode (SEL) comparateur . vous pouvez alors écrire votre propre méthode de tri qui renvoie NSOrderAscending si l'élément est antérieur, NSOrderDescending s'il est plus récent et NSOrderSame si c'est le même.

+0

J'utilise NSFetchedResultsController pour l'efficacité car j'ai un nombre potentiellement important d'enregistrements. Je ne peux pas charger l'ensemble des résultats dans un NSArray et utiliser cette méthode de tri. –

+0

Dans ce cas, les options sont d'arrêter d'utiliser NSFetchedResultsController, ou éventuellement diviser ces éléments dans une autre entité, je pencherais vers le premier, mais vous devrez faire très attention à l'envoi de notifications sur les changements de contexte. – MCannon