Mit einem binären Attribut lesen und schreiben Sie Instanzen von NSData direkt. Mit einem transformierbaren Attribut lesen und schreiben Sie Instanzen einer Klasse, die in und von NSData konvertiert werden kann. Die tatsächliche Datenspeicherung ist die gleiche wie bei einem binären Attribut, aber Core Data verwendet einen NSValueTransformer, um von NSData zu konvertieren, wenn nötig. Zum Beispiel, sagen Sie, Ihr verwaltetes Objekt hat ein Bildattribut, wo es bequem wäre, UIImage direkt zu lesen und zu schreiben. Außer, UIImage kann nicht in Core Data gespeichert werden. Aber UIImage kann zu und von NSData umgewandelt werden. Also, wenn du ein transformierbares Attribut benutzt hast, könntest du UIImage lesen und schreiben, während ich noch NSData im Datenspeicher behalte. Antwortete Jan 10 13 um 18:43 Tom, Würden die transformierbaren Daten das gleiche NSData-Verhalten bezüglich der externen Speicherung beibehalten (obwohl die externe Speicherung nicht explizit in der Benutzeroberfläche freigegeben wird oder die Blöcke im Core Data Store erscheinen) Die Dokumentation Bedeutet nicht genau, dass das transformierbare Attribut in einem externen Datensatz oder den Regeln, die angewendet werden, gespeichert wird. Kannst du deine Erfahrung teilen ndash Tommie C. Sep 13 15 at 2:19 Genau ich habe die gleiche Frage. Es gibt keine solche Option in Transformable Attributtyp, um in quotExternal Storagequot gespeichert werden. Ist dies standardmäßig eingeschaltet oder was ndash Marcin Kapusta 26. Februar 16 um 16: 02Wenn ein NSArray zu einem transformierbaren Core Data Attribut gespeichert wird, steht das Objekt nicht für den Zugriff auf den nachfolgenden Abruf seiner Entität zur Verfügung. Allerdings ist es nach jedem Abruf verfügbar. Was ist los Ich kann die Core Data Entity und ihre Attribute von einem Platz in meiner iOS App einstellen und speichern. Dann gehe ich, um die zuletzt gespeicherte Entität zu lesen. Alle Attribute außer den transformierbaren NSArrays sind verfügbar. Aus irgendeinem Grund tauchen die Arrays als leer auf (wenn sie in dem Protokoll gedruckt wird, sieht es so aus: Route (n) Wenn die App schließt und sich dann wieder öffnet, ist das Attribut nicht mehr leer. Irgendwelche Ideen, die ich verstehe, dass ein NSArray gespeichert wird Ein transformierbares Attribut ist nicht die beste Übung Könnten Sie erklären, warum dies geschieht Das NSArray ist mit CLLocation-Objekten gefüllt. Es gibt keine Fehler oder Warnungen in der Konsole gedruckt. Sie sind auch keine Compiler-Warnungen oder Fehler. Groß ist ein XCTest, für den ich geschrieben habe Dieser Test geht nicht bis zur letzten Behauptung (wie erwartet). Wie Sie unten sehen können, ist das, wie das Core Data Modell im Xcode eingerichtet ist. Das Routenattribut ist ausgewählt Und ohne die vorübergehende Eigenschaft. Ich brauche, um einen Value Transformer Name hinzufügen. Was ist, dass die Core Data Management Code selbst kommt aus meinem GitHub Repo, SSCoreDataManger (was funktioniert gut zu meinem Wissen) Hier ist die saveNewRunWithDate-Methode: Und unten ist Das RunDataModel NSManagedObject Interface: In der Implementierung werden diese Eigenschaften mit dem dynamischen A transformable Entity Attribut eingerichtet, das eine Instanz von NSValueTransformer durchläuft. Der Name der NSValueTransformer-Klasse, die für ein bestimmtes Attribut verwendet wird, wird im verwalteten Objektmodell festgelegt. Wenn Core Data auf die Attributdaten zugreift, ruft es NSValueTransformer valueTransformerForName auf: um eine Instanz des Werttransformators zu erhalten. Mit diesem Wert Transformator die NSData beharrte im Speicher für die Entität wird in einen Objektwert umgewandelt werden, der über eine Eigenschaft der verwalteten Objektinstanz zugegriffen wird. Weitere Informationen hierzu finden Sie im Abschnitt "Core Data Programming Guide". Nicht standardmäßige persistente Attribute Standardmäßig verwendet Core Data den für den Namen NSKeyedUnarchiveFromDataTransformerName registrierten Werttransformator und verwendet ihn umgekehrt, um die Transformation durchzuführen. Dies geschieht, wenn im Core Data Model Editor kein Wert Transformator Name angegeben wurde und ist in der Regel das gewünschte Verhalten. Wenn du einen anderen NSValueTransformer verwenden möchtest, musst du seinen Namen in deiner Anwendung registrieren, indem du NSValueTransformer setValueTransformer aufrufst: forName: und setze den Stringnamen im Modelleditor (oder in Code, was eine andere Sache ist). Denken Sie daran, der Wert Transformator Sie verwenden müssen sowohl Vor-und Rückwärts-Transformation. Der Default-Wert-Transformator kann jedes Objekt, das die Keyed-Archivierung unterstützt, in NSData umwandeln. In deinem Fall hast du einen NSArray (eigentlich ein NSMutableArray, was nicht gut ist). NSArray unterstützt NSCoding. Aber da es sich um eine Sammlung handelt, müssen die darin enthaltenen Objekte auch sie unterstützen - sonst können sie nicht archiviert werden. Zum Glück unterstützt CLLocation NSSecureCoding. Eine neuere Variante der NSCoding. Sie können die Umwandlung eines NSArray von CLLocation s mit Core Datas Transformator testen. Zum Beispiel: Ich würde Sie ermutigen, solche Tests für transformierbare Attribute zu schreiben. Es ist einfach, Änderungen an Ihrer Anwendung vorzunehmen, die mit dem Default-Transformator nicht kompatibel sind (z. B. das Einfügen von Objekten, die keine Keyed-Archivierung unterstützen). Mit einem Satz von Tests wie diesem bin ich nicht in der Lage, jedes Problem mit der Archivierung eines NSArray von CLLocation s zu reproduzieren. Es gibt einen sehr wichtigen Teil Ihrer Frage: Aus irgendeinem Grund erscheinen die Arrays als leer (wenn sie im Log gedruckt wird, sieht es so aus: Route (n) Wenn die App schließt und sich dann wieder öffnet, ist das Attribut nicht mehr leer Alle Ideen Dies zeigt an, dass (zumindest in Ihrer Anwendung, vielleicht nicht Ihr Test) die Daten umgewandelt und auf die Entität im Speicher angewendet werden. Wenn die Anwendung den Routenwert festlegt, wird das Array an den Speicher weitergegeben - wir wissen Wenn das nächste Mal die Anwendung gestartet wird, erscheint die Daten, die typischerweise ein Problem in der Anwendung bei der Kommunikation von Kontexten anzeigen. Aus dem Code, den Sie gepostet haben, scheint es, dass Sie einen einzigen Kontext verwenden und nur aus dem Haupt-Thread - Ihr SSCoreDataManager Singleton würde nicht anders funktionieren, und es ist mit dem veralteten Thread Confinement Gleichzeitigkeit Modell. Zur gleichen Zeit gibt es Orte SSCoreDataManager ist mit - performBlock: auf den einzelnen NSManagedObjectContext zugreifen. PerformBlock: sollte nur mit Kontexten verwendet werden, die mit einem Warteschlangen-Parallelitätstyp erstellt wurden. Der hier verwendete Kontext wurde mit - init erstellt. Die nur wraps - initWithConcurrencyType: und übergibt den Wert NSConfinementConcurrencyType. Aus diesem Grund haben Sie definitiv Parallelität Probleme in der Singleton, die sehr wahrscheinlich verursachen einige der Verhaltensweisen Sie sehen. Sie behaupten einen Attributwert auf einer Entität, aber später nicht sehen, dass der Wert, der reflektiert wird, wenn die Eigenschaft, die das Attribut verpackt, einen Fehler im verwalteten Objektkontext auslöst. Wenn Sie in der Lage sind, mit Xcode 6.x und iOS 8 zu entwickeln, aktivieren Sie das Core Data-Synchronisations-Debugging, indem Sie das Startargument an Ihre Anwendung übergeben. Dies sollte dazu führen, dass einige der Probleme hier für Sie sichtbarer sind, wenn auch nur callBlock: auf einem Kontext, der mit - init erstellt wurde, sollte eine Ausnahme verursachen, die bereits geworfen wird. Wenn Ihre Anwendung etwas tut, um Ausnahmen zu schlucken, die diese und weitere Probleme verstecken können. Es ist nicht klar von Ihrer Frage, ob Sie dies nur sehen, wenn Sie versuchen, auf Routen im Debugger zuzugreifen, oder wenn Sie auch sehen, gebrochene Funktionalität bei der Verwendung. Beim Debuggen von verwalteten Objekten muss man sich sehr bewusst sein, wenn Sie einen Fehler auf einen Eigenschaftswert ausgeben. Es ist möglich, dass man in diesem Fall ein leeres Array im Debugger sieht, nur weil es auf eine Weise zugegriffen wird, die keinen Fehler verursacht, zu schießen - was wäre richtiges Verhalten. Aus Ihrer Beschreibung des anderen Anwendungsverhaltens scheint es möglich zu sein, dass dies die Grenze Ihres Problems ist - schließlich werden die Werte korrekt beharrt. Leider erwähnt das Core Data Programming Guide kaum, was ein Fehler ist. Und tut so nebeneinander mit eindeutig. Das Faulting ist ein wesentlicher Bestandteil der Core Data - das ist der größte Teil des Einsatzes - und hat fast nichts mit Einmaligkeit zu tun. Glücklicherweise wurde vor einigen Jahren der Incremental Store Programming Guide mit vielen Einsichten in die Interna von Core Data aktualisiert, einschließlich fehlerhafter. Ihr Test und Singleton haben andere Probleme, die leider über den Rahmen dieser Frage hinausgehen. Das Problem besteht darin, das alte Geschäft nicht zwischen den Testläufen zu löschen. Das Objekt, das Sie überprüfen können, ist nicht das gleiche Objekt, das Sie gerade hinzugefügt haben. Stellen Sie außerdem sicher, dass die transiente Eigenschaft nicht gesetzt ist. Transiente Attribute werden nicht beibehalten. Heres, was in den Tests passieren könnte. An einem gewissen Punkt haben Sie neue Run ohne Route erstellt und gespeichert. Während des nächsten Testlaufs schaffst du ein weiteres Laufobjekt mit demselben Datum DATE01. Anstatt die Route-Eigenschaft des Objekts zu überprüfen, das du gerade erstellt hast, machst du das Fetch nach Datum sortiert. Alle Ihre Routen haben das gleiche Datum, so dass die Sortierung nach Datum nicht grundsätzlich die sortierten Ergebnisse beeinflussen. Das erste Objekt von Ihren Fetch-Ergebnissen passiert, um einige alte Objekt, wo Sie nicht die Route-Eigenschaft gesetzt. Nur für den Fall, log die newRun. route Wert innerhalb der - saveNewRunWithDate. Methode. Antwortete Jan 27 15 um 12:29 quellishs Antwort liefert Informationen über Core Data Fehler und einige der Nuancen und Trickeries, die darin liegen. Nach dem Graben, und mit der Hilfe dieser Antwort fand ich eine Lösung. Bevor Sie die gewünschte (Problem-) Entität abrufen, aktualisieren Sie das NSManagedObject im NSManagedObjectContext: Hier werden die persistenten Eigenschaften eines verwalteten Objekts aktualisiert, um die neuesten Werte aus dem persistenten Speicher zu verwenden. Es macht auch das Objekt zu einem Fehler. Antwortete Jan 31 15 um 19:33 Ich hatte ein ähnliches Problem, das ich wirklich schwer zu lösen fand. Am Ende habe ich es gelöst, aber es war nicht die Lösung hier, die es behoben hat. Ich möchte teilen, was ich gefunden habe, um irgendwo vor der gleichen Herausforderung wie ich zu arbeiten. In meinem Fall war das Problem, weil ich versuchte, ein NSMutableArray als transformierbares Core Data Attribut zu verwenden. Aber ich verstehe jetzt, dass du das nicht tun solltest. Stattdessen sollten Sie ein unveränderliches Array (zB NSArray) verwenden und dann, wenn Sie einen Wert im Array ändern müssen, kopieren Sie das Core Data Array in ein lokales, veränderliches Array (dh var NSArray in Swift), nehmen Sie die Änderung an der lokalen Array und führen Sie dann einen Befehl aus, um das Core Data Array dem geänderten lokalen Array zuzuordnen. Dann speichern Sie Core Data als normal. Wie ich schon sagte, mein Problem war ähnlich dem hier, aber es war nicht das gleiche. Und so behaupte ich nicht, dass dies die Lösung für dieses Problem ist. Ich teile das nur für andere, wenn dies ihnen hilft. Antwortete Mar 19 16 bei 0:23 Ihre Antwort 2017 Stack Exchange, IncUsing Transformable Ampampine Binäre Dateneigenschaften in Core Data: Wie Sie wissen Core Data Attribute können Eigenschaften wie Undefined, Integer16, Integer32, Integer64, Float, Decimal, Date, Boolean, String, Double, Binärdaten in Objective C zu bieten hat. Von diesen Eigenschaften sind Binärdaten zu berücksichtigen. Mit der Unterstützung all dieser Eigenschaften Swift Sprache bietet Ihnen auch Transformable Eigenschaft, die sehr interessant ist wichtig. Wegen dieser Eigenschaft können Sie jede Art von Daten in die Core-Daten ohne zusätzlichen Overhead. In diesem Tutorial werde ich Ihnen zeigen, wie man diese beiden Eigenschaften benutzt. (Binärdaten ampamp Transformable Eigenschaft). 1. Wie üblich erstellen Sie eine SingleView-Template-Anwendung ampamp name it ImportantDataTypeInCoreData ampamp wählen Sie Sprache als schnell aus Leaving Core Data Checkbox Ungeprüft werden wir unser Core Data Modell später einfügen. Wie in Bild unten gezeigt: 2. Fügen Sie ein Lied hinzu, dessen URL wir in das urlOfSong Attribut speichern werden, das wir im Modell kurz erstellen werden. 3. Nun, da wir ein Projekt haben, um Ampullen zu vervollständigen, werden wir Core Data Eigenschaften verwenden, also jetzt eine Cocoa Touch Klasse mit dem Namen Persistence erstellen, die Unterklasse von NSObject ampamp ist dann für das Einfügen von Modell klicken Sie auf den ImportantDataTypeInCoreData Ordner ampamp klicken Sie auf New File - gt Core Data (iOS Feld) - gtData Modell ampamp Name es Eigenschaften dann weiter, bis es erstellt wird, wie in Bild dargestellt: 4. Jetzt öffnen Sie das Modell, das Sie gerade erstellt ampamp hinzufügen eine Entität namens UseOfDataTypes mit zwei Attributen urlOfSong ampamp Name des Typs Transformable Ampulle Binärdaten, die im Bild unten angezeigt werden: 5. Halten Sie die Entität UseOfDataTypes ausgewählt, wir werden eine NSObject-Klasse erstellen. Klicken Sie auf den Editor ampamp dann klicken Sie auf die Create NSmanagedObject Subclass-Option ampamp folgen Sie den Anweisungen, bis die Klasse mit dem gleichen Namen wie Entity erstellt wird. NSObject-Unterklasse wird mit dem Namen selben eine Entity erstellt UseOfDataTypes öffnen sie ampamp Sie sehen etwas wie das, was in der unten dargestellten präsentiert wird Bild: Wie in diesem Bild gezeigt, ist urlOfSong Attribut vom Typ AnyObject, weil es von Transformable Typ Ampamp ist, muss es umgewandelt werden In was wir brauchen, um in Core Data zu speichern Ampamp Name ist vom Typ NSData, weil wir es auf Binary Data im Modell setzen. Gehen Sie voran ampamp verwandeln Sie Ihre Klasse in etwas in der unten gezeigten Bild: var managedObjectContext. NSManagedObjectContext. Lass modelURL NSBundle. MainBundle (). URLForResource (Eigenschaften mitExtension: momd) let managedObjectModel NSManagedObjectModel (contentOfURL: modelURL) let storeURL Persistenz. applicationDocumentDirectory. URLByAppendingPathComponent (properties. sqlite) lassen persistentStoreCoordinator NSPersistentStoreCoordinator (managedObjectModel: managedObjectModel) var Fehler. NSError. Nil if (persistentStoreCoordinator addPersistentStoreWithType (NSSQLiteStoreType) Konfiguration: null URL: storeURL, Optionen: null Fehler: amperror) nil) let managedObjectContext NSManagedObjectContext () managedObjectContext. PersistentStoreCoordinator persistentStoreCoordinator Hier in der oben angezeigten Code alles, was wir tun, ist nur immer den Pfad, wo wir speichern das Modell, das wir als benannt benannt als Eigenschaften. xcdatamodeld ampamp dann die Schaffung der Persistenz Speicher Koordinator ampamp ManagedObjectModel ampamp Kontext. ------ gtgtgtgtgtgt Jetzt haben wir alles Setup hinzufügen folgenden Code zu Persistence. Swift Datei zum Speichern von Objekten zu Core Data: let anyObject NSEntityDescription. insertNewObjectForEntityForName (UseOfDataTypes inManagedObjectContext: managedObjectContext) als. UseOfDataTypes lassen den Pfad NSURL (fileURLWithPath: NSBundle. MainBundle (). PathForResource (pooja. Typ: mp3)) anyObject. urlOfSong Pfad als NSURL var archievedName NSKeyedArchiver. ArchivedDataWithRootObject (Name) archiviert die zu speichernden Daten in Core Data for Binary Data Attribut
No comments:
Post a Comment