Frage

Ich habe eine Situation, wo ich will Objekte aus meinem Kerndatenspeicher durch die Benutzername Schlüssel holen, aber ich mag der Vergleich Groß- und Kleinschreibung sein. Das Prädikat ich habe, ist dies:

username IN $usernames

ich dann eine Variablensubstitution mit einer Reihe von Strings, die die Benutzernamen möchte ich zu finden sind. Es funktioniert aber case-sensitive. Ich möchte so etwas tun, denke ich:

username IN[c] $usernames

Leider, das nicht zu funktionieren scheint. Der String-Vergleich muss noch in Groß- und Kleinschreibung Weise geschehen. (Ich habe nicht einen Fehler über sie eine nicht unterstützte Abfrage zu sein.)

Gibt es eine andere Möglichkeit, dieses Prädikat zu schreiben, damit es so funktioniert, brauche ich oder bin ich nur etwas offensichtlich hier fehlt?

War es hilfreich?

Lösung

Der Fall Modifikator auf dem IN-Operator wird offenbar ignoriert, wenn ein Abruf gegen die SQLite Speicher ausgeführt wird. (Sie weggelassen, um den Store-Typen aus Ihrer Frage.)

Ich würde empfehlen, einen Fehler gegen die Dokumentation Archivierung, so dass diese Einschränkung / Verhalten dokumentiert werden kann.

Ich würde auch eine Feature-Anfrage Einreichung in dem Bug Reporter empfehlen, so dass dies für die künftige Unterstützung in Betracht gezogen werden.

In der Zwischenzeit werden Sie Ihre holen ziehen müssen Anfrage aus dem Datenmodell und baut es programmatisch auf. Sie können eine Verbindung Prädikat OR Prädikat bauen, die eine Groß- und Kleinschreibung Gleichheit Übereinstimmung für jede Ihren Wert tut (und testen Sie, dass es Ihre Leistungsanforderungen erfüllt.)

Beachten Sie, wenn Sie OS Ziele vor unterstützen, werden auf 10,6 der Fall Modifikator auf == nicht unterstützt wird, wobei in diesem Fall noch eine weitere alternative Lösung erforderlich sein wird.

Andere Tipps

Sie könnte so etwas wie ANY $usernames LIKE[c] username versuchen. Ich habe etwas Ähnliches getan, wo anstelle der variablen substution, ich habe nur ein Schlüsselpfad wie „persons.name“ und das Prädikat funktioniert für mich. Nicht sicher, ob es anders mit einer variablen dort anstelle eines Schlüsselpfad funktioniert, aber es ist einen Versuch wert.

Hier ist ein weiteres Problem zu umgehen, aber erfordert, dass Sie die MOM ändern.

Machen Sie Benutzername eine vollständige geblasene Einheit. Erstellen Sie die inverse Beziehung zwischen Benutzernamen und was auch immer Ihre anderen Einheit ist.

Jetzt für die Anforderung holen, stellen Sie die Einheit als „Benutzername“ und dann dieses Prädikat laufen (einen „Namen“ Eigentum und „Eltern“ Eigenschaft vorausgesetzt):

   [NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject]

Dies kann zu viel des Guten, aber ermöglicht es Ihnen, Ihre Suche auszuführen, wie gewünscht.

Obwohl diese Frage ist schon einige Jahre alt Ich stolperte über das gleiche Problem und löste es wie folgt aus:

NSArray  *values = @[@"FOO", @"bar" ,@"lorem"];
NSString *predicate;

predicate = @"value LIKE[cd] '";
predicate = [predicate stringByAppendingString:
             [values componentsJoinedByString:
              @"' OR  value LIKE[cd] '"]];
predicate = [predicate stringByAppendingString:@"'"];

NSLog(@"%@",  predicate);
// Output:
// value LIKE[cd] 'FOO' OR  value LIKE[cd] 'bar' OR  value LIKE[cd] 'lorem'

Dies erzeugt eine statische Prädikat Ausdruck aus der Werteliste. Vielleicht wird es für jemanden nützlich sein.

UPDATE 2:

Eigentlich scheint es, wie die aktualisierte Lösung unter nicht mit SQLite funktioniert und produziert ein

'NSInvalidArgumentException',
reason: 'unimplemented SQL generation for predicate : ... (bad LHS)'

Ich denke, für Array / dict / set comparisions und IN gibt es nur auf der linken Seite des Betreibers erlaubt Tasten.

UPDATE:

Nach einigen Recherchen auf Ausdrücke und Prädikate ich einen anderen aproach gefunden, die ganz gut zu funktionieren scheint:

NSPredicate *predicate =
   [NSPredicate predicateWithFormat:
     @"lowercase(value) IN %@", values];

Dies verwendet die Funktion Ausdruck lowercase: die Kleine Darstellung des Wertes zu erhalten. Alles, was noch zu tun ist, um sicherzustellen, dass alle Einträge von values klein geschrieben werden, und Sie werden in der Lage Groß- und Kleinschreibung IN Ausdrücke zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top