2017-05-15 4 views
0

NeedKerndaten Fetch-Anforderungsfehler für Prädikat

Ich habe den Rekord mit rec_name zu finden ist "Apple-256GB Macbook" & isActive == true.

Anfrage Fetch

fetchRequest.predicate = NSPredicate(format: "rec_name LIKE[cd] *%@* AND rec_name LIKE[cd] *%@* AND isActive = %@","apple","macbook",true) 

Fehler

Unable to parse the format string "rec_name LIKE[cd] *%@* AND rec_name LIKE[cd] *%@* AND isActive = %@" 

Danke,

+0

Ein Platzhalter für einen 'Bool' ist' % d' oder '% ld' anstatt% @' – vadian

+0

@vadian, danke für deine Hilfe, aber es funktioniert immer noch nicht! – nirav

+0

Versuchen Sie Folgendes: Lassen Sie Prädikat = NSPredate (Format: "rec_name LIKE [CD] *% @ * UND rec_name LIKE [CD] *% @ * und isActive =% @", "Apple", "Macbook", NSNumber (booleanLiteral: true)) – KKRocks

Antwort

1

Das Problem ist wegen *%@* hier %@ zwischen dem * nicht durch ein String-Argument ersetzt, so NSPredicate nicht in der Lage ist, Ihre Abfrage LIKE *apple* und LIKE *macbook* zu machen, was Sie tun müssen, ist zu machen eine Suchzeichenkette mit Wildcards und mit Like einfach %@ verwenden, auch als @Vadian vorgeschlagene Verwendungsnummer anstelle von Bool.

let searchkeyword1 = "apple" 
let searchkeyword2 = "macbook" 

//Make search string wildcards charaters 
let searchString1 = "*\(searchkeyword1)*" 
let searchString2 = "*\(searchkeyword2)*" 

fetchRequest.predicate = NSPredicate(format: "rec_name LIKE[cd] %@ AND rec_name LIKE[cd] %@ AND isActive = %@", searchString1,searchString2, true as NSNumber) 

Auch Option Teig hier ist man CONTAINS und keine Notwendigkeit verwenden können Platzhalter zu verwenden.

fetchRequest.predicate = NSPredicate(format: "rec_name CONTAINS[cd] %@ AND rec_name CONTAINS[cd] %@ AND isActive = %@", "apple","macbook", true as NSNumber) 

Sie können noch etwas tun, wenn Sie alle Rekord beginnen mit Apfel finden wollen und mit macbook enden dann können Sie einfach BEGINSWITH und ENDSWITH

fetchRequest.predicate = NSPredicate(format: "rec_name BEGINSWITH[cd] %@ AND rec_name ENDSWITH[cd] %@ AND isActive = %@", "apple","macbook", true as NSNumber) 
+1

Besser : 'NSNumber (value: true)' oder 'true as NSNumber', vergleiche http://stackoverflow.com/a/42933246/1187415. In der Regel gibt es keinen Grund, die Initialisierer "xxxLiteral" aufzurufen, sie werden nur für den Compiler benötigt. –

+1

@MartinR Danke für den Vorschlag, editierte Antwort mit ihm –

+0

danke Nirav für die Antwort, es funktioniert! – nirav

0

Versuchen Sie, diese

fetchRequest.predicate = NSPredicate(format: "rec_name LIKE[cd] %@ AND rec_name LIKE[cd] %@ AND isActive = %@","apple","macbook",NSNumber(booleanLiteral: true)) 
0

Sie benötigen ein Prädikat Abfrage einstellen wie folgt:

fetchRequest.predicate = NSPredicate(format: "rec_name == %@ AND isActive == %@" , "Apple 256GB Macbook", NSNumber(booleanLiteral: true)) 

Ich glaube nicht, dass wir wie verwenden müssen, wenn Sie für ein perfektes Spiel suchen.

0

Versuchen Sie, diese

NSPredicate(format: "rec_name == %@ AND rec_name == %@ AND isActive = %d","apple","macbook",true)