Core Data-Eigenschaft ändern von Integer 16 Integer 32
Ich habe ein sehr ernstes problem. Die Anwendung ist Leben, aber leider ist es fehl auf iOS 5, und ich muss nach einem update.
Die Sache ist die ID-Spalte der wenigen Personen in Integer 16, aber ich muss noch geändert werden, um Integer 32.
Es war eindeutig mein Fehler, das Modell erstellt wurde, vor sehr langer Zeit, und es war nur noch wiederverwendet werden. Zu meiner überraschung (jetzt) auf iOS 4, Integer 16 in Core Data könnte leicht halten Sie die Anzahl so groß wie 500 000 (bug?), aber es funktioniert nicht wie das jetzt ist - es gibt mir ungültigen Nummern.
Anwendung ist live, hat es Erfolg und Kern-Daten werden auch verwendet, um den Benutzer erzielt, Erfolge und so weiter, was ich nicht entfernen möchten, sodass Sie die Anwendung neu installieren. Was ist der beste Ansatz zu ändern einfach an die zehn Eigenschaften in verschiedenen Entitäten von Integer 16 Integer 32?
Natürlich kenne ich den Namen und Entitäten, die für diese Eigenschaften.
Wenn ich nur ändern Sie die Spalte Typ für die Eigenschaften, die in der xcdatamodeld-Datei, wird es Arbeit, für neue user, aber was über die vorhandenen Benutzer,, die bereits über sqlite-Datei in Ihrem Dokumente-Ordner. Ich glaube, ich brauche eine änderung der persistent store coordinator irgendwie.
Ist, und was tun Sie, was über die Leistung, es sind über 10 Eigenschaften, die news geändert werden, von 16 auf 32, aber Core-Daten in üblichen Fällen mehr als 100 000 Objekte im inneren.
Hinsichtlich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schalten
NSMigratePersistentStoresAutomaticallyOption' and 'NSInferMappingModelAutomaticallyOption
in IhremNSPersistentStore
und dann erstellen Sie eine zweite version Ihres Modells mit den änderungen. Nur die integer-änderungen, um die migration einfach. Das ermöglicht Benutzern installieren-upgrade migrieren Sie von der zerbrochenen Modell das korrigierte Modell.HINWEIS: Diese muss werden, die eine automatische migration; eine manuelle migration mit einem mapping-Modell wird nicht funktionieren.
Hintergrund
Vorherige version der app-set-Attribut als 16 bit bei Core Data.
Dieser war zu klein, um große Werte, die größer als ca 32768.
int 16 verwendet 1 bit zum darstellen von Zeichen, also maximaler Wert = 2^15 = 32768
In iOS 5, diese Werte übergelaufen in den negativen zahlen.
34318 wurde -31218
36745 wurde -28791
Reparieren diese negativen Werte, fügen Sie 2^16 = 65536
Hinweis: diese Lösung funktioniert nur, wenn der ursprüngliche Wert war kleiner als 65536.
Hinzufügen eines neuen Modells
Im Datei-navigator, wählen Sie Anwendung.xcdatamodeld
Wählen Sie Menü-Editor/Add Model Version
Version name: schlägt vor, "Anwendung 2" aber Sie können ändern, z.B. MyAppVersion2
Basierend auf Modell: MyApp
In new MyAppVersion2.xcdatamodel ändern-Attribut-Typ von integer 16 integer 64.
Im Datei-navigator, wählen Sie "Verzeichnis " MyApp".xcdatamodeld
Offenen rechten Fensterbereich Inspektor, Versioniert Kern-Daten-Modell Aktuelle ändern von Anwendung zu MyAppVersion2.
Im linken Bereich Datei-navigator, grünes Häkchen bewegt sich von der Anwendung.xcdatamodel zu MyAppVersion2.xcdatamodel.
In MyAppAppDelegate managedObjectModel nicht ändern resource name von @"MyApp"
In Xcode wählen Sie Ordner ModelClasses.
Datei/Add-Core-Data-Mapping-Modell.
Wählen Sie das Quell-Daten-Modell Anwendung.xcdatamodel
Wählen Sie " Ziel Daten Modell MyAppVersion2.xcdatamodel
Sparen Sie Als MyAppToMyAppVersion2.xcmappingmodel
Hinzufügen Ziel MyApp.
In MyAppAppDelegate persistentStoreCoordinator schalten CoreData manuelle migration
Fügen Sie eine Migrationspolitik
MyAppToMyAppVersion2MigrationPolicy
Im folgenden Beispiel wird eine Entität "Environment" mit einem integer-Attribut "FeedID" und einem string-Attribut "title".
In der Datei navigator wählen Sie MyAppToMyAppVersion2.xcmappingmodel
Im Fenster, zeigen, rechts-utilities-Bereich.
Im Fenster, wählen Sie das Entity-Mappings EnvironmentToEnvironment
In der rechten Seite Entity Mapping, wählen Sie Benutzerdefinierte Richtlinie geben Sie MyAppToMyAppVersion2MigrationPolicy.
Speichern der Datei.
Referenzen:
Zarra, Core Data, Kapitel 5, S. 87 http://pragprog.com/book/mzcd/core-data
http://www.informit.com/articles/article.aspx?p=1178181&seqNum=7
http://www.timisted.net/blog/archive/core-data-migration/
http://www.cocoabuilder.com/archive/cocoa/286529-core-data-versioning-non-trivial-value-expressions.html
http://www.seattle-ipa.org/2011/09/11/coredata-and-integer-width-in-ios-5/
Privat, Pro Core Data für iOS-Ch 8 p273
Will nur bestätigen, Marcus S. Zarra Antwort mit einem kleinen Zusatz. Es funktioniert gut für uns, zu einem gewissen Grad. Wir machten genau denselben Fehler in unserem Modell. Aber es hat ein problem. Werte, über das, was zu sein scheint 2^24 umgewandelt wird, um 16-bit-Werte bei der automatischen migration, aber gespeichert als 32-bit-aber mit dem falschen Wert.
Zum Beispiel:
17 479 261 wird 18 851
(17 479 261 mod (2^16)) - (2^16) = -18 851
Wir heruntergeladen die DB aus dem Telefon und in der Datenbank gesucht und die Nummer geändert in der DB.
Wir haben noch nicht dieses problem gelöst.