2017-01-13 4 views
2

Ich bin neu bei Mac und schreibe meine erste App mit Core Data. Ich habe ein Datenmodell, in dem es die Entität SizeRecord gibt, die ein einzelnes Attribut "size" und einzelne Beziehungs "files" hat, die eine Menge von FileRecord Referenzen sind. Ich kann ein SizeRecord erstellen und ordnungsgemäß in der Datenbank speichern. Ich bin auch in der Lage den Datensatz aus der Datenbank zu erhalten:Core Data Prädikat funktioniert nicht

let sizeFetch: NSFetchRequest<SizeRecord> = SizeRecord.fetchRequest() 
    let size: UInt64 = 106594 
    //sizeFetch.predicate = NSPredicate(format: "size == %i", size) 
    do { 
     let fetchedSizes = try dbCtx.ctx.fetch(sizeFetch) 
    } catch { 
    } 

Wer ich dies ausführen, fetchedSizes Array enthält einzelnen abgerufene Datensatz wie erwartet:

▿ 1 element 
- 0 : <SizeRecord: 0x10584fcc0> (entity: SizeRecord; id: 0x100495ea0 <x-coredata://F7EC8A0C-06E1-46AE-A875-34E4523AAC2A/SizeRecord/p1> ; data: { 
files =  (
    "0x100336310 <x-coredata://F7EC8A0C-06E1-46AE-A875-34E4523AAC2A/FileRecord/p2>" 
); 
size = 106594; 

jedoch, wenn ich das Prädikat über Kommentar-, erhalte ich ein leeres Array als Ergebnis. Dies ist ein Inhalt von sizeFetch:

<NSFetchRequest: 0x1058e4890> (entity: SizeRecord; predicate: (SIZE == 106594); sortDescriptors: ((null)); type: NSManagedObjectResultType;) 

Bitte irgendeine Idee, was ich falsch mache? Es muss etwas sehr einfach und dumm :)

Antwort

5

„SIZE“ ist ein reserviertes Wort im Prädikat Format-String-Syntax sein, siehe Predicate Format String Syntax im „Prädikat Programming Guide“.

Die Lösung ist die %K Keyword-Erweiterung zu verwenden (was eine gute Idee im Allgemeinen ist, um Konflikte mit reservierten Worten zu vermeiden):

NSPredicate(format: "%K == %i", "size", size) 

oder noch besser mit der #keyPath Richtlinie, die die Compiler zu erlaubt Überprüfen Sie die Eigenschaft Name:

NSPredicate(format: "%K == %i", #keyPath(SizeRecord.size), size)