L'ajout d'objets uniques à la Base de Données

Je suis en train de travailler sur une application iPhone qui obtient un certain nombre d'objets à partir d'une base de données. Je tiens à les stocker à l'aide de Base de Données, mais je vais avoir des problèmes avec mes relations.

Un Détail contient aucun nombre de Poi (points d'intérêt). Quand j'ai récupérer un ensemble de POI à partir du serveur, ils contiennent les détails de l'ID. Pour associer le PVE avec le Détail (par ID), mon processus est comme suit:
Requête de la ManagedObjectContext pour la articleid.
Si ce détail n'existe, ajoutez les points d'intérêt.
Si elle n'existe pas, créez le détail (il a d'autres propriétés qui sera remplie paresseusement).

Le problème, c'est la performance. L'exécution constante des requêtes de Base de Données est lente, au point où l'ajout d'une liste de 150 PI prend une minute grâce aux multiples liens.

Dans mon ancien modèle, avant de Base de Données (différents NSDictionary les objets du cache) ce processus a été super rapide (chercher une clé dans un dictionnaire, puis la créer si elle n'existe pas)

J'ai plus de relations que seulement celui-là, mais à peu près chaque un seul a faire cette vérification (certains sont plusieurs à plusieurs, et ils ont un réel problème).

Quelqu'un aurait-il des suggestions pour comment je peux vous aider? J'ai pu effectuer un peu moins de requêtes (par la recherche d'un certain nombre de différents ID), mais je ne suis pas sûr de combien cela va vous aider.

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];
}
Expliquer vos objets plus en détail, et après le code que vous utilisez. C'est presque 100% de chances il y a un moyen de faire ce que vous êtes déjà faire beaucoup plus rapidement.

OriginalL'auteur Dimitri | 2009-08-05