2012-09-21 7 views
31

Sembrava alta e bassa per questa, ma non riesce a trovare la risposta. Sto cercando di interrogare i dati di base per tutti i record che NON sono uguali a una stringa specificata. Ad esempio, tutti i record che non sono uguali all'ID di sessione corrente. Ho provato questi senza successo:Query NSPredicate per non contenere una stringa specifica

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", [sitListingID objectAtIndex:i]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ NOT CONTAINS[cd] %@",@"listingID", [sitListingID objectAtIndex:i]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ NOT CONTAINS %@",@"listingID", [sitListingID objectAtIndex:i]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID NOT like %@", [sitListingID objectAtIndex:i]]; 

Niente funziona.HEEEEELP !!! ------------------------------------------------- ---- più codice

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ListingRecord" inManagedObjectContext:context]; 
    [request setEntity:entity]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sessionID <> %@", uniqueSessionListings]; 
    [request setPredicate:predicate]; 
    NSError *error = nil; 
    NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy]; 
+0

si potrebbe fornire un metodo complesso? Magari puoi recuperare i dati di spam. – NeverBe

risposta

96

il tuo primo predicato

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"listingID != %@", sessionID]; 

dovrebbero lavorare per trovare tutti i record in cui l'attributo listingID non è uguale a sessionID (a condizione che listingID e sessionID hanno lo stesso tipo).

Se entrambi sono stringhe e si desidera trovare tutti i record in cui listingIDnon contiene la stringa sessionID come una stringa, allora questo predicato dovrebbe funzionare:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (listingID CONTAINS %@)", sessionID]; 

"riporta [cd]" se il confronto delle stringhe dovrebbe essere fatto caso e insensibile al diacritico.

NOTA: È possibile specificare il nome di attributo come un argomento, ma poi è necessario utilizzare %K invece di %@ come formato:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (%K CONTAINS %@)", @"listingID", sessionID]; 
+1

HECK YEAH! Questo ha fatto il trucco. Domanda a risposta rapida, a meno che non diventi cieco. Non ho letto la tua soluzione nella Guida alla programmazione di Apple Predicate. L'ho perso nella guida o è coperto da qualche altra parte? (chiedendo un riferimento futuro) – sangony

+3

@sangony: Quando ho iniziato con la programmazione di Core Data ho avuto anche difficoltà con i predicati, la Guida alla programmazione del Predicato potrebbe essere più dettagliata. A volte è difficile combinare tutti i possibili confronti, operazioni e predicati nell'ordine corretto. Si potrebbe dire che tutto è stato detto nella "Definizione BNF dei Predicati di Cacao" :-) - Ho imparato molto leggendo le domande e le risposte di altre persone qui a SO. –

+1

Questo è utile ma esiste un modo per aggiungere un operatore "non contiene" a un 'NSPredicateEditorRowTemplate'? Esiste un 'NSContainsPredicateOperatorType' ma non un' NSDoesNotContainPredicateOperatorType' (a meno che non l'abbia perso). – Jon

Problemi correlati