2013-03-03 9 views
5

Ich bin Entwickler und Anwendung, die prüfen muss, ob eine Zeichenfolge in der Datenbank gespeichert wurde oder nicht. Das mag eine einfache Operation sein, aber es braucht eine halbe Sekunde, um eine Antwort zurückzugeben, von der ich denke, dass sie ziemlich viel ist. Meine Frage ist, ob es irgendeinen Weg gibt, diese Zeit zu reduzieren. Danke für Ihr Interesse.Core Data Abrufanforderung Optimierung

Dies ist mein aktueller Code:

- (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

Können Sie die Entitäten und Beziehungen erklären? Ich verstehe das Prädikat nicht ganz. –

+0

Es gibt keine Beziehung zwischen den verschiedenen Entitäten. Insbesondere enthält diese Entität nur ein Attribut, das als _deletedpics_ bezeichnet wird. Mit Bezug auf das Prädikat soll überprüft werden, ob das Bild als gelöscht gemeldet wurde oder nicht. Ich organisiere die gelöschten Register als "delete.status (Variable, die ich für andere Operationen benötige) .picturenummer". In dieser Funktion möchte ich prüfen, ob ein bestimmtes Bild gelöscht wurde oder nicht, ohne den Status zu berücksichtigen. Deshalb habe ich dieses Prädikat verwendet. Ich hoffe, es ist jetzt klarer. –

+0

Versuchen Sie, diese Eigenschaft zu indizieren. Was ist '@" gelöscht. *.% I "'gemein? –

Antwort

5

Eine Optimierung ist

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

von

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

zu ersetzen, wenn Sie nur für die Existenz von Objekten überprüfen mögen.

Aber ich nehme an, dass das Hauptleistungsproblem die Wildcard-Suche mit LIKE ist, die langsamer ist als die Suche mit ==.

Statt den Status zu speichern und die Bildnummer in einem Attribute als deleted.<status>.<picturenumber> (wie Sie in einem Kommentar geschrieben haben) es wäre wahrscheinlich besser, getrennte Attribute status und picturenumber in der Einheit zu verwenden.

Dann können Sie für eine Bildnummer mit dem Prädikat suchen

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

die viel schneller sein sollte. Bei Bedarf können Sie diese Eigenschaft zusätzlich indizieren (wie in einem Kommentar als @flexaddicted erwähnt).

+0

+1 Ich hatte keine Zeit, eine Antwort zu geben, aber deine ist gut. Danke, dass du meinen Kommentar zitiert hast. –

+0

@flexaddicted: Danke :-) –