2016-12-11 3 views
0

Dies ist mein Code:Absturz, wenn sie in Core Data speichern

func storingMessage() { 

let appDelegate = UIApplication.shared.delegate as! AppDelegate 

let context = appDelegate.persistentContainer.viewContext 

let adagio = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) 
adagio.setValue("Adagio", forKey: "name") 
adagio.setValue("adagio", forKey: "profileImageName") 

let messageAdagio = NSEntityDescription.insertNewObject(forEntityName: "Message", into: context) 
messageAdagio.setValue("adagio", forKey: "friend") 
messageAdagio.setValue("This is boring....", forKey: "text") 
messageAdagio.setValue(NSDate(), forKey: "date") 

let glaive = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) 
glaive.setValue("Glaive", forKey: "name") 
glaive.setValue("glaive", forKey: "profileImageName") 

let messageGlaive = NSEntityDescription.insertNewObject(forEntityName: "Message", into: context) 
messageGlaive.setValue("glaive", forKey: "friend") 
messageGlaive.setValue("I will cut you to pieces", forKey: "text") 
messageGlaive.setValue(NSDate(), forKey: "date") 

do { 

    try context.save() 
    print("SAVED!!!!") 

} catch let err { 

    print(err) 

} 

} 

Und das ist der Fehler:

-[Swift._NSContiguousString managedObjectContext]: unrecognized selector sent to instance 0x600000051040 2016-12-11 10:22:34.834 Chat App - Core Data Demo[21356:1755677] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Swift._NSContiguousString managedObjectContext]: unrecognized selector sent to instance 0x600000051040'

ich kann nicht herausfinden, was los ist. Ich habe 2 Entitäten, Freund und Nachricht. Friend hat name und profileImageName als Zeichenfolgenattribute und Nachricht hat Text und Datum und beide haben eine inverse Beziehung. Das sind so viele Daten wie ich euch geben kann. Bitte helfen Sie.

+1

Meine Vermutung ist, das 'viewcontext' Getter etwas tut es sollte nicht. Platzieren Sie ein paar Pausen, um herauszufinden, warum Sie eine Zeichenfolge in diesem Code bekommen könnten –

Antwort

0
let adagio = NSEntityDescription.insertNewObject(forEntityName: "Friend", into: context) as! Friend 
     adagio.name = "Adagio" 
     adagio.profileImageName = "adagio_photo" 

     //setting up the message as a Message() type and filling in the parameters 
     let messageAdagio = NSEntityDescription.insertNewObject(forEntityName: "Message", into: context) as! Message 
     messageAdagio.friend = adagio 
     messageAdagio.text = "This is boring...." 
     messageAdagio.date = NSDate() 

Dies funktionierte. Also ist der Unterschied statt .setValue() Ich habe nur die Attribute der Modelle verwendet. Ich habe keine Ahnung, was der Unterschied ist, aber nach Forschung und Forschung ... das ist das, was funktioniert hat. Meine Vermutung ist, die Struktur oder die Art der Daten nicht irgendwie passten ...

+1

Es gibt einen ** großen ** Unterschied. Ihr alter Code von 'messageAdagio.setValue (" adagio ", forKey:" friend ")' versucht, der Eigenschaft 'friend' einen' String' zuzuweisen. In dem Code, den Sie in dieser Antwort gepostet haben, weisen Sie der Eigenschaft "friend" ein Friend-Objekt zu. Die Verwendung von 'setValue' hätte mit 'messageAdagio.setValue (adagio, forKey:" friend ")' gearbeitet. – rmaddy

1

Verwenden Sie keine Low-Level-Funktionen wie setValue (: :) forKey für NSManagedObject Subklassen.

Das Problem ist hier:

messageAdagio.setValue("adagio", forKey: "friend") 
... 
messageGlaive.setValue("glaive", forKey: "friend") 

Sie versuchen einstellen Wert vom Typ String Feldes zum Objekt vom Typ Freund

+0

würde es keinen Fehler werfen? Ich verstehe, was du meinst, aber es hat mir keinen Fehler gemacht. –

+0

Ja, hat es nicht. Eigentlich könnten Sie verrückte Dinge mit Ihren NSManagedObjects in einem NSManagedObjectContext machen. Wie mache ich verrückte Beziehungen, setze * nil * auf nicht-optionale Felder, setze negative Werte auf zwei Felder, was eine positive Ursache für NSManagedModel sein sollte. – Simbos

+0

Alle notwendigen Prüfungen werden jedoch nur durchgeführt, wenn Sie Ihren Kontext speichern/speichern/zusammenführen – Simbos

Verwandte Themen