CoreData - set kann nicht leerer string als default-Wert für Attribut
Ich habe eine Person in meinem datamodel mit einem string-Attribut, das derzeit optional, und ich möchte zu konvertieren, das auf ein erforderliches Attribut mit einem Standardwert einer leeren Zeichenfolge.
Als andere entdeckt haben, verlassen Sie den Standardwert leer in die Xcode-CoreData Daten modeller Ergebnisse bei der Validierung Fehler (da der designer interpretiert dies als NULL), aber das versuchen ", "" oder @"" als default-Wert Ergebnisse in diesen literalen Zeichen interpretiert wird als Standard, anstatt die leere Zeichenfolge mit der Länge null, wie gewünscht.
Habe ich dieser thread auf Google, jedoch, abgesehen von der Lösung wirklich hässlich (Modell-definition aufgeteilt .xcdatamodel und objc Quelle), ist es auch nicht funktioniert, für leichte Migrationen, weil diese Migrationen erfolgen ausschließlich auf der Grundlage der .xcdatamodel Dateien und der objc-Logik aus Ihrem entity-Implementierungen nicht geladen.
Gibt es eine Möglichkeit, dies zu erreichen in der data model designer?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine sehr interessante Frage. Nach einigen Tests glaube ich nicht, das ist möglich, weil der Weg das Textfeld in das Datenmodell konfiguriert ist.
Im Prinzip könnte man mit dem unicode-leer-Satz Charakter
\u2205
zur Darstellung eines leeren Standard-Zeichenfolge, sondern wird das Textfeld nicht scheinen zu akzeptieren, entgeht so wandelt er jeden Versuch zu entkommen, ein unicode-Zeichen-code, um die Zeichenkette von den code-Zeichen für die sich z.B. die Eingabe von '\u2205' endet, als der wörtliche text '\u2205'.In der Theorie könnten Sie schreiben, eine utility-app zum Lesen in die grafisch generierten managed-object-Modell-Datei und dann programmgesteuert setzen Sie das Attribut standardmäßig gleich einen leeren string ein und speichern Sie die Datei zurück auf die Festplatte. Ich sage "in der Theorie", denn es gibt keinen dokumentierten Weg, um Weg zu sparen, eine managed-object-Modell-Datei von code. Sie Lesen können, und ändern Sie es in der Erinnerung, aber nicht beibehalten, die änderungen.
Bisschen ein versehen, denke ich.
Ich glaube nicht, dass Sie keine Wahl haben, aber um die empty string pragmatisch, wenn das Modell geladen wird. Das ist einfach zu tun, aber es ist hässlich und Sie sich merken müssen, Sie hat (vor allem, wenn Sie migrieren Versionen), aber ich denke jetzt, dass ist die einzige Wahl.
Peitsche aus Ihrem bevorzugten XML-editor (ich habe gerade verwendet Emacs) und Tauchen nach unten, um die
contents
Datei im.xcdatamodel
bundle innerhalb der.xcdatamodeld
bundle. Fügen Sie einfach eindefaultValueString=""
XML-Attribut, um die<attribute>...</attribute>
element innerhalb der<entity>...</entity>
Klammern.Hier ist ein Beispiel:
Kann ich nicht sprechen, ob diese überlebt migration, da ich noch nicht zu tun hatte, dass noch.
contents
Datei, zumindest simuliert eine CoreData-data modeler, ohne diese mis-feature. Alle anderen Lösungen sind relativ Schwergewichts-code Verbesserung für ein problem, das gelöst werden sollten, die zur design-Zeit, d.h. mit einem nicht-buggy-modeler.Ich dieses Problem gelöst, durch überschreiben der getter-für meinen Bereich - wenn es null enthält, habe ich wieder einen leeren string statt:
Bisher scheint es zu tun, der trick, und ich würde vorstellen, es würde keine Auswirkungen Migrationen (obwohl ich nicht weiß genug über Sie, um sicher sagen). Ich weiß nicht wirklich, ob es eine null oder ein leerer string in der db, nach dem all - so lange, wie ich bekommen "" anstelle von null, wenn ich Fragen für das Feld.
Mein Ansatz zur Lösung dieses Problems war die Schaffung eines
NSManagedObject
Unterklasse und Griff die substitution von leere strings für Nullwerte inawakeFromInsert
. Sodann habe ich alle Personen als Kinder, die aus dieser Unterklasse statt Kinder vonNSManagedObject
. Die Annahme hier ist, dass ich möchte, jeder string-Attribut innerhalb einer bestimmten Entität werden auf einen leeren string gesetzt standardmäßig (es würde nicht funktionieren, oder würde zumindest erfordern zusätzliche Logik, wenn Sie wollte, einige bleiben NULL innerhalb der gleichen Einheit).Wahrscheinlich gibt es ein effizienter Weg, dies zu tun, aber da es nur Einheit der Schöpfung, ich glaube nicht, dass es zu viel von einem performance-hit.
awakeFromInsert
- statt mitsetValue:forKey:
verwendensetPrimitiveValue:forKey:
so, dass die KVO nicht ausgelöst.Können Sie es manuell tun.
In Ihrer model-Klasse, überschreiben awakeFromInsert und stellen Sie Ihre Saiten auf eine leere Zeichenfolge
Swift:
Objective-C
Hier ist die Swift-Lösung basierend auf der David Ravetti Antwort und edelaney05 Kommentar. Zusätzlich habe ich noch optionalität überprüfen.
Diese Lösung funktioniert gut in meine Projekte.
Vielleicht bin ich spät dran mit dieser Antwort, aber ich war Googeln und dieses forum gefunden.
Die Lösung ist ganz einfach:
Alle änderungen sind einfach.
Teil 2
Teil 3