2010-10-15 5 views
1

Je travaille sur une application iPhone qui représente graphiquement une base de données volumineuse, accessible via core-data, dans un graphique linéaire. J'utilise une approche en mosaïque pour rendre ce graphique. La distance entre les points de données est irrégulière.Comment obtenir un point de données supplémentaire au-delà de la plage de données demandée dans les données de base?

Chaque tuile utilise un prédicat pour récupérer les données pertinentes pour cette tuile:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"creationDate > %@ AND creationDate < %@",tileBeginDate, tileEndDate];

[request setPredicate:predicate];

NSMutableArray *result = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

J'ai un problème lors de l'élaboration des lignes entre des points de données résidant dans des tuiles différentes, puisque le dessin de cette ligne nécessite une datapoint en dehors de la plage de la tuile.

Idéalement, je voudrais être en mesure d'obtenir un point de données au-delà de la plage demandée dans les données de base. Est-ce qu'il y a un moyen de faire ça? Si non, d'autres suggestions?

+0

J'ai un certain nombre de solutions différentes, dont aucune vraiment résoudre mon problème satisfaisant:
- Pour chaque carreau, récupérer une quantité fixe de données au-delà de cette tuile ainsi.
Problème: Cette méthode est inefficace et échoue lorsque le point de données suivant est toujours en dehors de la plage demandée.
- Pour chaque point de données, mémorisez également le point de données suivant et le point de données précédent.
Problème: Augmente l'empreinte mémoire et la taille de la base de données de trois fois.
- effectue une recherche incrémentielle pour le point de données suivant.
En fait, je pense que cela pourrait être la solution. Ajoutez simplement une requête supplémentaire pour obtenir le point de données suivant. Duh.
TinkerTank

Répondre

0

L'un de ces cas classiques où l'écriture du problème résout le problème. Dans ce cas, malheureusement, quelques minutes après l'affichage. Pardon.

La solution est simple: je viens d'ajouter deux prédicats, un pour récupérer les points de données avant et un pour récupérer les points de données après la demande de données de gamme, puis je fusionner les tableaux ensemble.

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// Get the the last point (closest to now) first. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[request setFetchLimit:1]; // Keeps the application fast and the memory requirements low. 
[sortDescriptors release]; 
[sortDescriptor release]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"creationDate > %@",realEndDate]; 
[request setPredicate:predicate]; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

// Get the data within the requested range. 
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO]; 
sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[request setFetchLimit:200]; // Keeps the application fast and the memory requirements low. 
[sortDescriptors release]; 
[sortDescriptor release]; 
predicate = [NSPredicate predicateWithFormat:@"creationDate > %@ AND creationDate < %@",beginDate, realEndDate]; 
[request setPredicate:predicate]; 
NSMutableArray *additionalFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
[mutableFetchResults addObjectsFromArray:additionalFetchResults]; 
[additionalFetchResults release]; 

// Get the first point last 
[request setFetchLimit:1]; 
predicate = [NSPredicate predicateWithFormat:@"creationDate < %@",beginDate]; 
[request setPredicate:predicate]; 
additionalFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
[mutableFetchResults addObjectsFromArray: additionalFetchResults]; 
[additionalFetchResults release]; 
+0

Marquez votre question comme vous l'avez répondu alors. –

+0

apparemment, je peux le faire après deux jours. Si c'est jusqu'à la seule réponse d'ici là, je le ferai. – TinkerTank

Questions connexes