Ich versuche, verwaltetes Objekt mit einem Attribut vom Typ Date in managedObjectContext
zu speichern.
Code ist wie:
%Vor%beim Context-Speichern stürzt das Programm mit SIGABRT ab. Hier ist ein Konsolenprotokoll:
%Vor%Weiß jemand, warum ich das habe? Zweite Frage ist, warum, wenn ich im Debugger-Modus eincheck% Co_de% ist nicht NSDate Typ, sondern __NSDate (doppelte Unterstrich vorne).
Danke!
UPDATE:
Ich habe einige Änderungen vorgenommen, um den Fehler leichter zu finden. Der Code ist jetzt wie folgt:
%Vor% Also, hier speichern wir definitiv NSDate. reminder.eventDate ist auch NSDate. Aber ich habe immer noch diesen Fehler. Wenn ich comment selectedDate
speichere wirft einen weiteren Fehler (Datum ist Pflichtfeld in NSData, so save: gibt den Fehler "Der Vorgang konnte nicht abgeschlossen werden." Mit reminder.eventDate = [NSDate date];
.
Die CoreData-Struktur wird mehrfach überprüft - eventDate hat den Typ Date.
UPDATE (Problem gelöst): Endlich habe ich das Problem gefunden. eventDate = nil;
wurde als Schlüssel für die eventDate
in meinen Tabellenansichtszellen gesetzt (dafür habe ich KVO benutzt). Also wenn es keinen direkten Aufruf gab und ich keine Methodenaufrufe für detailTextLabel.text
finden konnte. Seltsam ist, dass der Absturz auf der Methode eventDate
war, nicht später. Und in der Aufrufliste gibt es überhaupt keine Methode save
...
Nur um das zu ergänzen, was bereits gesagt wurde:
Es muss kein Problem mit dem Modell oder der NSManagedObject-Unterklasse sein. Es könnte fast überall ein Code sein, der isEqualToString:
aufruft. Irgendwo haben Sie ein Objekt, das der Code annimmt, sollte ein NSString sein, ist aber stattdessen ein NSDate-Objekt. Ich würde jeden Code betrachten, der Daten in Zeichenfolgen konvertieren könnte.
Da es jedoch beim Speichern passiert, würde ich alle Anpassungen betrachten, die Sie möglicherweise an der Unterklasse vorgenommen haben.
Der Startpunkt ist das Durchsuchen des Projekts nach isEqualToString:
.
Aktualisierung:
Da isEqualToString
eine Testmethode ist, kann sie jederzeit aktiviert werden, wenn Sie einen Vergleich für eine Zeichenfolge wie in einer Sortierung durchführen. Ich konnte Ihren genauen Fehler nicht reproduzieren, aber der folgende Code tut etwas ähnliches:
... entspricht, aber löst eine Ausnahme aus:
%Vor% Sie können also sehen, wie diese Fehler auftreten können. Es ist auch eine Demonstration dafür, warum Sie mit der Verwendung von id
vorsichtig sein sollten.
So albern es klingt, ich würde vorschlagen, dass Sie überprüfen, ob sowohl Ihr Erinnerungsobjekt als auch der zugehörige managedObjectContext gültig sind.
Sie sind sicher, dass Ihr Modell eventDate als Datumsattribut korrekt modelliert und Sie außerdem sicher sind, dass das Objekt, das Sie an das eventDate-Attribut übergeben, ein NSDate-Objekt ist. Versuchen Sie also, zu überprüfen, dass die Erinnerung und ihr managedObjectContext nicht null sind.
Überprüfen Sie abschließend, ob alle anderen Attribute und Relationen richtig gesetzt sind (prüfen Sie, ob Sie tatsächlich alle erforderlichen Attribute und Relationen einfügen, prüfen Sie, ob die von Ihnen verwendeten Objekte den richtigen Typ haben usw.).
Dies wird auch helfen, die Möglichkeiten einzuschränken.
BEARBEITEN : Sie können überprüfen, was tatsächlich in Ihrer SQLite-Datenbank passiert. Fügen Sie einfach Folgendes als Argument hinzu, bevor Sie Ihre Anwendung starten:
-com.apple.CoreData.SQLDebug 1
Weitere Informationen finden Sie in der Dokumentation .
Wie Sie dies tun, hängt von Ihrem installierten Toolset (Xcode 3 oder 4) ab. Ich verwende den neuesten Xcode 4 und um ein Argument hinzuzufügen, wählen Sie einfach Ihr aktuelles Schema aus, dann wählen Sie "Ihren App-Namen ausführen" und klicken auf die Registerkarte "Argumente", um das Argument hinzuzufügen.
Das klingt so, als hätte Ihr Datenmodell eine Zeichenfolge in der eventDate-Eigenschaft anstelle eines Datums erwartet.
NSDate ist ein "Klassencluster", was bedeutet, dass Instanzen, mit denen Sie tatsächlich zu tun haben, Instanzen einer privaten Unterklasse von NSDate sind (in diesem Fall __NSDate).
Was den Fehler betrifft, stimme ich Simon Goldeen zu, dass der wahrscheinlichste Grund ist, dass das Datenmodell oder die NSManagedObject-Unterklasse eine Zeichenfolge und nicht ein Datum erwartet.
Ich habe das auch gejagt. Da Ihre Modell- und Klassendefinitionen gut sind und Ihr Wert gut ist, gibt es einen weniger offensichtlichen Platz, der es für mich repariert hat ... Löschen Sie die App vom Gerät und säubern Sie Ihren Build und stellen Sie sicher, dass alle sqlite-Seed-Dateien neu sind auch. Mein Gerät oder der Build-Ordner hatte einen alten Speicher oder ein Modell, das diesen Fehler verursacht hat. Welche anderen Frameworks verwenden Sie? RestKit, JSON, usw.? Alles, was eine Klassenmethode überlädt, könnte auch ein Verdächtiger sein. ... schwer zu sagen, was verglichen wird in diesem speichern ... Meine Vermutung ist ein alter Laden
Tags und Links objective-c iphone ios core-data