Problem beim Speichern von NSDate im CoreData-Kontext

8

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 ...

    
OgreSwamp 27.02.2011, 16:59
quelle

5 Antworten

2

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:

%Vor%

... 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.

    
TechZen 28.02.2011, 17:28
quelle
7

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.

    
Massimo Cafaro 04.03.2011 09:13
quelle
6

Das klingt so, als hätte Ihr Datenmodell eine Zeichenfolge in der eventDate-Eigenschaft anstelle eines Datums erwartet.

    
Simon Goldeen 27.02.2011 17:05
quelle
3

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.

    
Anomie 27.02.2011 18:14
quelle
0

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

    
Greg Combs 07.03.2011 05:16
quelle

Tags und Links