mit NSPredicate enthält zu finden, die Zeichen innerhalb einer coredata-Entität-Feld
Ich versuche zu finden alle Kunden, die eine bestimmte Folge von Buchstaben. Ich möchte die gleiche Funktionalität zu NSString ist rangeofString außer Fall insensative. Hier ist meine Methode:
-(NSArray *) db_search: (NSString *) table where: (NSString*) fieldKey contains: (NSString*) value withSortField: (NSString *) sortField{
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:table inManagedObjectContext:context];
if (fieldKey != nil){
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"(%@ contains[c] %@)",
fieldKey,value];
[request setPredicate:predicate];
}
[request setEntity:entity];
if (sortField != nil){
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:[self extractSortField:sortField] ascending:[self isAscending:sortField]] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];
[request setSortDescriptors:sortDescriptors];
}
NSError *error;
return [context executeFetchRequest:request error:&error];
}
Nenne ich es mit diesen Werten:
NSArray * results = [self db_search:@"Customer" where:@"fullname" contains:@"matt" withSortField:nil];
Anstatt alle Matts, Matthews, etc, es friert ein, wenn ich versuche, drucken Sie die Ergebnisse. Ich gedebuggt, und wir bekommen nicht einmal eine leere NSArray zurück. Ich drucken Sie das NSArray auf die Konsole und ich bekomme nicht 0 Elemente.. bekomme ich nur nichts.
Ich habe versucht dabei einen dump der DB zu der Konsole und es enthält alle die richtigen Dinge in der it. HILFE!!!!!
=UPDATE======================================================
Ich bin mit %K und ich bin immer eine seltsame Laufzeitfehler:
if (searchResults1 != nil){
NSLog(@"%Matches: %i", [searchResults1 count]);
}else {
NSLog(@"Was NULL");
}
Seine auf der NSLog(@"%Übereinstimmt: der Linie. Seine SCHLECHTE EXC Fehler. So searchResults1 ist nicht nill aber es stürzt ab, wenn ich versuche zu Lesen, die zählen? Wenn ich debug, searchResults1 ist in der Tat ein NSArray, aber es scheint nicht zu haben, nichts drin.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es aussieht, dein problem ist dein Prädikat:
Wenn Sie pass in
fieldKey = @"fullname"
undvalue = @"matt"
dieses Prädikat wird äquivalent zu:Sehen Sie das problem? Es ist die Behandlung von "fullname" als raw-string, und nicht als name für ein Feld. Dies ist, weil Sie mit der
%@
Modifikator in das format string. WennNSPredicate
kommt über diejenigen, die es sagt "aha! der Wert wird ersetzt, hier wird eine Konstante". Was Sie wirklich wollen, es zu tun ist, sagen Sie "aha! der Wert wird ersetzt, hier wird ein Bezeichner".Anstatt also mit
%@
verwenden%K
. Dies ist ein spezieller Modifikator nur für Prädikate, und es bedeutet, ersetzen Sie in der Zeichenfolge als Kennung (wirklich wie eine "Schlüsselpfad"), das heißt, es wird Ihr Prädikat sein:Das ist, was du bist suchen für.
Kann ich sagen, aus der Art, wie Sie Ihren Namen von Variablen und Parametern, die Sie denken in der SQL-Bedingungen. Core Data ist nicht SQL. Entitäten sind nicht die Tabellen. Objekte sind nicht in Zeilen. Spalten sind keine Attribute. Core Data ist ein object-graph-management-system, die möglicherweise oder möglicherweise nicht erhalten, das Objekt graph und können oder können nicht verwenden Sie SQL-weit hinter den kulissen zu tun. Versucht zu denken, der Core-Daten in SQL-Bedingungen führen, dass Sie völlig missverstehen Core-Daten und das Ergebnis in viel Leid und vergeudete Zeit.
In diesem block:
... Sie haben zwei Probleme hier. Erstens
searchResults1
wird nie null. Unabhängig davon, ob der Abruf findet alle Objekte, wird es wieder ein array-Objekt. Stattdessen sollten Sie prüfen, die Anzahl der array. Zweitens, die%Matches
ist ein Tippfehler. Die%
ist eine Formatierung, steuerzeichen und bewirkt, dass der complier Aussehen für ein control-code z.B.%@
sofort danach. Versuchen Sie dies:Ich vergaß die Rückkehr der NSArray in einem meiner Helfer-Methoden.