2013-03-03 4 views
5

Je suis en train de développer une application qui doit vérifier si une chaîne a été enregistrée dans la base de données ou non. Cela peut sembler une opération facile, mais il faut une demi-seconde pour retourner une réponse qui, je pense, est beaucoup. Ma question est de savoir s'il y a moyen de réduire ce temps. Merci de votre intérêt.Optimisation de la requête de récupération des données de base

Ceci est mon code actuel:

- (BOOL) isDeleted:(int)i { 

    NSString *value = [NSString stringWithFormat:@"deleted.*.%i", i]; 

    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    NSString *entityName = @"Deleted"; 
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entityName inManagedObjectContext:context]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDesc]; 

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(deletedpics like %@)", value]; 
    [request setPredicate:pred]; 

    NSError *error; 
    NSArray *objects = [context executeFetchRequest:request error:&error]; 

    BOOL returnBool = [objects count] >= 1 ? YES : NO; 
    return returnBool; 

} 
+0

Pourriez-vous expliquer les entités et les relations? Je ne comprends pas très bien le prédicat. –

+0

Il n'y a pas de relation entre les différentes entités. Plus précisément, cette entité contient juste un attribut qui est celui appelé _deletedpics_. En se référant au prédicat, l'idée est de vérifier si l'image a été rapportée comme supprimée ou non. J'organise les registres supprimés comme "deleted.status (variable dont j'ai besoin pour d'autres opérations) .picturenumber". Dans cette fonction je veux vérifier si une certaine image a été supprimée ou non sans tenir compte de l'état. C'est pourquoi j'ai utilisé ce prédicat. J'espère que c'est plus clair maintenant. –

+0

Essayez d'indexer cette propriété. Que signifie «@» supprimé. *.% I "'? –

Répondre

5

Une optimisation est de remplacer

NSArray *objects = [context executeFetchRequest:request error:&error]; 

par

[request setFetchLimit:1]; 
NSUInteger count = [context countForFetchRequest:request error:&error]; 

si vous voulez seulement vérifier l'existence d'objets.

Mais je suppose que le principal problème de performance est la recherche générique avec LIKE, qui est plus lent que la recherche avec ==.

Au lieu de stocker l'état et le numéro de l'image dans un attribut comme deleted.<status>.<picturenumber> (comme vous avez écrit dans un commentaire) il serait probablement préférable d'utiliser des attributs distincts status et picturenumber dans l'entité.

Ensuite, vous pouvez rechercher un numéro d'image avec le prédicat

[NSPredicate predicateWithFormat:@"picturenumber == %d", i]; 

qui devrait être beaucoup plus rapide. Si nécessaire, vous pouvez également indexer cette propriété (comme @flexaddicted mentionné dans un commentaire).

+0

+1 Je n'ai pas eu le temps de mettre une réponse mais la tienne est bonne. Merci d'avoir cité mon commentaire. –

+0

@flexaddicted: Merci :-) –

Questions connexes