Je travaille sur une application iPhone qui récupère un certain nombre d'objets à partir d'une base de données. J'aimerais les stocker en utilisant des données de base, mais j'ai des problèmes avec mes relations.Ajout d'objets uniques aux données de base
Un détail contient un nombre quelconque de POI (points d'intérêt). Lorsque je récupère un ensemble de POI sur le serveur, ils contiennent un ID de détail. Pour associer le POI au détail (par ID), mon processus est le suivant: Interrogez le ManagedObjectContext pour le detailID. Si ce détail existe, ajoutez-y le poi. Si ce n'est pas le cas, créez le détail (il a d'autres propriétés qui seront peuplées paresseusement).
Le problème avec ceci est la performance. L'exécution de requêtes constantes sur les données de base est lente, au point que l'ajout d'une liste de 150 POI prend une minute grâce aux multiples relations impliquées.
Dans mon ancien modèle, avant que les données de base (divers objets de cache NSDictionary) ce processus était super rapide (chercher une clé dans un dictionnaire, puis créez si elle n'existe pas)
J'ai plus de relations que juste celui-ci, mais à peu près tout le monde doit faire cette vérification (certains sont nombreux à beaucoup, et ils ont un vrai problème).
Est-ce que quelqu'un a des suggestions pour aider? Je pourrais effectuer moins de requêtes (en cherchant un certain nombre d'ID différents), mais je ne suis pas sûr de savoir combien cela va aider.
Certains code:
POI *poi = [NSEntityDescription
insertNewObjectForEntityForName:@"POI"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
poi.POIid = [attributeDict objectForKey:kAttributeID];
poi.detailId = [attributeDict objectForKey:kAttributeDetailID];
Detail *detail = [self findDetailForID:poi.POIid];
if(detail == nil)
{
detail = [NSEntityDescription
insertNewObjectForEntityForName:@"Detail"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
detail.title = poi.POIid;
detail.subtitle = @"";
detail.detailType = [attributeDict objectForKey:kAttributeType];
}
-(Detail*)findDetailForID:(NSString*)detailID {
NSManagedObjectContext *moc = [[UIApplication sharedApplication].delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"Detail" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"detailid == %@", detailID];
[request setPredicate:predicate];
NSLog(@"%@", [predicate description]);
NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil || [array count] != 1)
{
// Deal with error...
return nil;
}
return [array objectAtIndex:0];
}
Expliquez vos objets plus en détail et publiez une partie du code que vous utilisez. Il est presque 100% probable qu'il existe un moyen de faire ce que vous faites déjà beaucoup plus vite. – Sneakyness