2014-02-27 5 views
20

Ich habe die Kerndaten für eine Weile in meinem Projekt verwendet. Vor einigen Tagen habe ich festgestellt, dass einige der in der Datenbank gespeicherten Datensätze nicht in der Benutzeroberfläche der Anwendung angezeigt werden. Ich habe es aufgespürt und festgestellt, dass sie überhaupt nicht abgerufen werden, wenn ich leere Zeichenfolge mit NSPredate herausfiltern. Und alle beginnen mit nicht alphabetischen Zeichen.Core Data - NSPredate zum Herausfiltern einer leeren Zeichenfolge, die nicht korrekt funktioniert

Um das Problem zu klären, erstellte ich ein Beispielprojekt und fügte einige Beispieldaten in die Datenbank ein. Sagen wir, sie sind "Sample", "+ Sample", "Sample +".

Hier ist der Codeausschnitt, den ich verwendet habe, um leere Zeichenfolge herauszufiltern. "Text" ist der Name der Zeichenfolgeneigenschaft und moc ist die NSManagedObjectContext-Instanz.

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"BasicEntity"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text.length > 0"]; 
[request setPredicate:predicate]; 

NSArray *samples = [moc executeFetchRequest:request error:&error]; 

Ergebnis Array enthält nur 2 Einheiten, die "Sample" und "Sample +" sind.

Ich probierte sogar dasselbe Prädikat (natürlich mit self.length anstelle von text.length) auf einfache Array mit über Beispielzeichenfolgen, und ich bekomme alle 3 richtig.

Ich frage mich, ob jemand das gleiche Problem erlebt. Oder fehlt mir etwas bei der Verwendung von Core Data? Getestet auf iOS 7.0.3 Simulator & 7.0.6 iPad Air.


UPDATE: Wie in einem anderen Thread beantwortet, löste ich dieses Problem mit regulären Ausdruck.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text MATCHES %@", @".{1,}"]; 

Dennoch glaube ich ursprüngliches Prädikat verwenden gültig ist. Ich werde Apple einen Fehler melden, um ihre Meinung zu erfahren.

+4

möglich doppelte http://stackoverflow.com/questions/19889211/coredata-predicate-string-property-length –

+0

@BenAvery Ja, u sing MATCHES kann ein Workaround sein. Aber ich glaube nicht, dass die Länge der Stichlänge in NSPredate ungültig ist. Es filtert Entitäten mit Text der Länge 0 heraus und funktioniert gut mit [NSArray filteredArrayUsingPredicate:]. Ich möchte wissen, ob dies mein Missverständnis ist, oder ich muss Apple einen Fehler melden. – Wonjae

+0

Versuchen Sie, den Abruf ohne Prädikat auszuführen, und überprüfen Sie die zurückgegebenen Elemente. Wenn es genau alle Zeichenfolgen enthält, die Sie erwartet haben, kann das Problem mit dem Prädikat auftreten. Andernfalls liegt das Problem wahrscheinlich bei den Codierungen, die Sie zum Erstellen der Zeichenfolgen verwenden, bevor Sie sie in Core speichern. –

Antwort

-2

Try this:

NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name!=nil AND name!="""]; 
+0

Dies wird nicht kompiliert. –

4

Dies ist, was Sie

[NSPredicate predicateWithFormat:@"%K != %@", @"text", @""] 

möchten Wenn Sie dies auch für nil/NULL tun müssen, um überprüfen:

[NSPredicate predicateWithFormat:@"%K != NULL && %K != %@", @"text", @"text", @""]