2010-05-14 4 views
4

Donc, je construis une petite application, il utilise base de données de base de ~ 25mb taille avec 4 entités. C'est pour les horaires d'autobus. Dans une table nommée "Stop", il y a ~ 1300 entrées d'arrêts de bus avec des attributs "name", "id", "longitude", "latitude" et des relations de couple. Maintenant, il y a beaucoup d'arrêts avec un attribut de nom identique mais des coordonnées et un identifiant différents. Donc, je veux montrer tous les noms d'arrêt distincts dans la vue tableau, j'utilise setReturnsDistinctResults avec NSDictionaryResultType et setPropertiesToFetch. Mais setReturnsDistinctResult ne fonctionne pas et je reçois toujours toutes les entrées.Core data setReturnsDistinctResult ne fonctionne pas

Code Heres:

- (NSFetchRequest *)fetchRequest { 
    if (fetchRequest == nil) { 
     fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Stop" inManagedObjectContext:managedObjectContext]; 
     [fetchRequest setEntity:entity]; 
     NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES] autorelease]]; 
     [fetchRequest setSortDescriptors:sortDescriptors]; 
     [fetchRequest setResultType:NSDictionaryResultType]; 
     [fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"name"]]]; 
     [fetchRequest setReturnsDistinctResults:YES]; 
     DebugLog(@"fetchRequest initialized"); 
    } 
    return fetchRequest; 
} 

///////////////////// 

- (NSFetchedResultsController *)fetchedResultsController { 
    if (self.predicateString != nil) { 
     self.predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", self.predicateString]; 
     [self.fetchRequest setPredicate:predicate]; 
    } else { 
     self.predicate = nil; 
     [self.fetchRequest setPredicate:predicate]; 
    } 
    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sectionNameKeyPath cacheName:nil]; 

    return fetchedResultsController; 
} 

////////////// 

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    cell.textLabel.text = [[fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"name"]; 

    return cell; 
} 
+0

N'a pas trouvé de solution. Peut-être que c'est un bug, parce que les chaînes dans l'attribut name utilisent non seulement l'alphabet latin: \. Je suis allé en utilisant executeFetchRequest et en filtrant toutes les entrées dans le tableau. – Moze

Répondre

5

Cela peut être en retard pour vous, mais peut aider les autres.

J'ai eu le même problème. Ce que j'ai trouvé, c'est que, si le type de magasin persistant est NSSQLiteStoreType, le retour à la propriété ReturnDistinctResults fonctionne. Mais pour NSXMLStoreType les valeurs distinctes ne fonctionnent pas.

Je n'ai pas testé les résultats pour NSBinaryStoreType et NSInMemoryStoreType.

+0

Je l'ai testé et je peux confirmer que c'est correct – mdubez