Je travaille sur une application iPhone qui récupère un certain nombre d'objets d'une base de données. J'aimerais les stocker en utilisant Core Data, mais j'ai des problèmes avec mes relations.
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. Afin d'associer le POI au détail (par ID), mon processus est le suivant : Interroger le ManagedObjectContext pour l'ID du détail. Si ce détail existe, y ajouter le POI. Si ce n'est pas le cas, créer le détail (il a d'autres propriétés qui seront remplies paresseusement).
Le problème, c'est la performance. L'exécution de requêtes constantes vers les données de base est lente, au point que l'ajout d'une liste de 150 points d'intérêt prend une minute en raison des multiples relations impliquées.
Dans mon ancien modèle, avant Core Data (divers objets de cache NSDictionary), ce processus était très rapide (rechercher une clé dans un dictionnaire, puis la créer si elle n'existe pas).
J'ai d'autres relations que celle-ci, mais presque toutes doivent faire l'objet de cette vérification (certaines sont trop nombreuses, et elles ont un vrai problème).
Quelqu'un a-t-il des suggestions pour m'aider ? Je pourrais effectuer moins de requêtes (en recherchant un certain nombre d'identifiants différents), mais je ne suis pas sûr que cela soit très utile.
Un peu de 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];
}