core-data-migration

___ tag123multithreading ___ Multi-Threading ist die Fähigkeit eines Computers oder eines Programms, Arbeit gleichzeitig oder asynchron auszuführen, indem mehrere gleichzeitige Ausführungsströme (im Allgemeinen als Threads bezeichnet) verwendet werden. ___ tag123coredata ___ Core Data ist das Objektmodellierungs- und Persistenz-Framework von Apple für Mac OS und iOS. Xcode bietet einen Objektmodelleditor zum Festlegen von Entitäten, Attributen und Beziehungen. ___ tag123iphonesdk30 ___ Bezieht sich auf das iPhone Software Development Kit, Version 3.0. ___ tag123iphone ___ Verwenden Sie diesen Tag NICHT, es sei denn, Sie wenden sich speziell an Apple's iPhone und / oder iPod touch. Verwenden Sie für nicht hardwareabhängige Fragen das Tag [ios]. Weitere zu betrachtende Tags sind [xcode] (aber nur, wenn es sich um die IDE selbst handelt), [swift], [objective-c] oder [cacao-touch] (aber nicht [cocoa]). Bitte verzichten Sie auf Fragen zum iTunes App Store oder zu iTunes Connect. Wenn Sie C # verwenden, markieren Sie mit [mono]. ___ tag123coreatamigration ___ für Probleme im Zusammenhang mit der Migration von CoreData auf OS X-Systemen ___ qstnhdr ___ Out-of-Memory während der Core-Datenmigration ___ answer4637389 ___

Ich vermute, dass Sie eine Reihe von Änderungen vornehmen müssen, die Sie zusätzlich zu den Daten aus den Blobs machen möchten. Mein Vorschlag ist, die Migration in ein paar Stufen durchzuführen. Ich denke hier irgendwie laut nach, also könnte es möglich sein, das zu verbessern. Dazu müssen Sie SQLite verwenden.

Damit das funktioniert, haben Sie drei Versionen Ihres Modells:

  1. Das ursprüngliche Modell
  2. Das Modell mit dem Attribut entfernt (und möglicherweise mit einer speziellen eindeutigen ID hinzugefügt - siehe unten)
  3. Das Modell mit allen von Ihnen vorgenommenen Änderungen, einschließlich des Hinzufügens der neuen Entität und der Beziehungen, die das Attribut
  4. ersetzen

Der Grund dafür ist, dass der Übergang von Version 1 zu 2 mit einer automatischen Lightweight-Migration möglich sein sollte. In diesem Fall muss Core Data nichts in den Speicher laden - es werden nur SQL-Anweisungen ausgegeben, um die Änderungen direkt in der Datenbank vorzunehmen.

Sie beginnen damit, Ihren persistenten Store-Koordinator mit der alten Modellversion einzurichten. Nachdem Sie die Daten geladen haben, durchlaufen Sie alle Objekte, die Sie migrieren, extrahieren Sie das Binärattribut und schreiben Sie es irgendwie auf den Datenträger. Sie können eine Abrufanforderung mit Batch-Entleerung und regelmäßigem Autorelease-Pool-Entleeren verwenden, um sicherzustellen, dass nicht zu viel Speicher für temporäre Objekte belegt wird. Speichern Sie die Daten in dem Verzeichnis, das Sie mit NSCachesDirectory erhalten. Sie möchten die Daten natürlich so speichern, dass Sie sie wieder mit der verwalteteObjektID des Objekts verknüpfen können.

Dann schließen Sie alles und bitten Core Data, den Speicher von Version 1 auf Version 2 zu migrieren. Weitere Informationen finden Sie unter diesen Link für Details. Öffnen Sie den Laden mit Version 2.

Sie müssen möglicherweise einen Schritt hinzufügen, bei dem Sie jedem Objekt eine eindeutige ID zuweisen, da ich nicht sicher bin, ob Core Data Objekt-IDs bei einer nicht leichten Migration verwaltet. Wenn Sie dies tun müssen, würde Ihr Modell der Version 2 dem Objekt, dem Sie die Binärdaten entnehmen, ein neues Attribut hinzufügen, das entweder optional ist oder einen Standardwert hat. Da die einfache Migration die managedObjectIDs nicht ändern sollte, können Sie die Zuordnung Ihrer neuen eindeutigen ID zu den managedObjectIDs speichern, die Sie zusammen mit den binären Daten vor zwei Absätzen gespeichert haben.

Speichern Sie die Daten und schließen Sie das Geschäft.

Öffnen Sie den Store und führen Sie eine Migration von Version 2 zu Version 3 durch. Dies sollte im Grunde der Code sein, den Sie bereits geschrieben haben, bevor Sie die Frage gepostet haben. Sobald der Store geöffnet ist, fügen Sie alle Objekte hinzu, die Sie im Store der Version 1 gespeichert haben, und richten Sie die Beziehungen mit den Daten ein, die Sie auf dem Weg gespeichert haben.

Einfach, oder?

    
___ qstntxt ___

Ich migriere ein CoreData-Modell zwischen zwei Versionen einer Anwendung. Ich habe binäre Daten als Blobs in der vorherigen Version gespeichert, und ich möchte sie aus den Blobs für die Leistung entfernen. Mein Problem ist, dass es während der Migration so aussieht, als ob Core Data alles in den Speicher lädt, was zu Low Memory Warnings führt und dann dazu führt, dass meine App getötet wird.

Die Apple-Dokumentation schlägt Folgendes vor: Ссылка

Es scheint sich jedoch auf die Tatsache zu verlassen, dass die großen Objekte unterschiedlich kartiert werden. In meinem Fall sind alle Objekte im Grunde gleich und auf jedes von ihnen muss das gleiche Mapping angewendet werden. Ich sehe in diesem Fall nicht, wie ich ihre Technik anwenden könnte.

Wie sollte ich eine Migration mit sehr großen Objekten handhaben?

    
___
0
Antworten

iOS 10 Core Data Exception Code Fehler: (6922)

Beim Versuch, Core Data unter iOS 10 zu migrieren, tritt eine Ausnahme von unserer SQL-Datenbank auf. Die Ausnahme wird ausgelöst, aber die Migration scheint weiterhin erfolgreich zu sein. Wir führen eine manuelle Migration durch, dann übernimmt...
17.02.2017, 22:20
1
Antwort

iOS: Swift: CoreData: Werte werden nicht mit PrivateManagedObjectContext gespeichert

In meiner Anwendung habe ich eine Klasse (zB CoredataHandler.swift) zum Speichern und Abrufen von Objekten verwendet. Ich habe diese Tutorials verfolgt. Ich habe Strategie 2: Parent / Child Managed Object Contexts verwendet. Objekte werden j...
26.07.2016, 06:22
1
Antwort

Out-of-Memory während der Core-Datenmigration

Ich migriere ein CoreData-Modell zwischen zwei Versionen einer Anwendung. Ich habe binäre Daten als Blobs in der vorherigen Version gespeichert, und ich möchte sie aus den Blobs für die Leistung entfernen. Mein Problem ist, dass es während der M...
18.12.2010, 17:40