Domanda

Ho una situazione dove voglio andare a prendere gli oggetti dal mio deposito dei dati di base dal tasto nome utente, ma voglio che il confronto sia tra maiuscole e minuscole. Il predicato che ho è questa:

username IN $usernames

Ho poi faccio una sostituzione di variabile con un array di stringhe che sono i nomi utente vorrei trovare. Funziona ma è case-sensitive. Mi piacerebbe fare qualcosa di simile, penso:

username IN[c] $usernames

Purtroppo, che non sembra funzionare. Il confronto stringa deve ancora accadere in un modo maiuscole e minuscole. (Non ottengo un errore sul fatto che sia una query non supportato.)

C'è un modo diverso di scrivere questo predicato in modo che funziona il modo in cui ho bisogno o mi manca solo una cosa ovvia?

È stato utile?

Soluzione

Il caso modificatore l'operatore IN è apparentemente ignorata quando si esegue un'operazione di recupero contro il negozio di SQLite. (È omesso il tipo di archivio dalla tua domanda.)

Mi consiglia di deposito di un bug nei confronti della documentazione in modo che questa limitazione / comportamento può essere documentato.

Consiglio anche la presentazione di una richiesta di funzionalità del giornalista bug in modo che questo può essere preso in considerazione per il supporto futuro.

Nel frattempo, si dovrà tirare la tua richiesta di recupero fuori dal modello di dati e costruire in su programatically. È possibile costruire un predicato composto o predicato che fa una partita di uguaglianza insensibile caso per ognuno dei vostri valori (e prova che soddisfi le vostre esigenze di prestazioni.)

Si noti che se si stanno sostenendo gli obiettivi OS precedenti a 10.6 il caso modificatore == non è supportato, in questo caso ancora sarà richiesto un'altra soluzione alternativa.

Altri suggerimenti

Si potrebbe provare qualcosa di simile ANY $usernames LIKE[c] username. Ho fatto qualcosa di simile, in cui al posto del substution variabili, ho solo un percorso chiave come "persons.name", e che il predicato funziona per me. Non sono sicuro se funziona in modo diverso con una variabile lì, invece di un percorso della chiave, ma vale la pena un colpo.

Ecco un'altra soluzione, ma richiede di cambiare il MOM.

Crea nome utente un'entità in piena regola. Creare la relazione inversa tra il nome utente e qualunque sia il vostro altra entità è.

Ora, per la richiesta di recupero, impostare l'entità come "Nome utente" quindi eseguire questo predicato (assumendo un "nome" di proprietà e la proprietà "genitore"):

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

Questo può essere eccessivo, ma vi permetterà di eseguire la ricerca, se lo desideri.

Anche se questa domanda è diversi anni Ho appena imbattuto lo stesso problema e risolto in questo modo:

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'

Questo crea un'espressione del predicato statica dalla lista valori. Forse sarà utile a qualcuno.

UPDATE 2:

In realtà sembra che la soluzione aggiornata di seguito non funziona con SQLite e produce un

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

Credo per comparazioni matrice / dict / set e IN ci sono solo possibili chiavi sul lato sinistro dell'operatore.

UPDATE:

Dopo alcune ricerche sulle espressioni e predicati ho trovato un altro aproach, che sembra funzionare abbastanza bene:

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

Questo utilizza l'espressione lowercase: funzione per ottenere la rappresentazione minuscola del valore. Tutto ciò che resta da fare è quello di garantire che tutte le voci di values sono minuscole e sarete in grado di utilizzare espressioni case IN insensibili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top