2010-08-16 8 views
6

Ich muss ein benutzerdefiniertes Klassenobjekt in Coredata speichern. Das Problem ist meine benutzerdefinierte Klasse enthält Strukturen, Enum usw. Ich habe folgende Methode versucht.So speichern Sie benutzerdefinierte Objekte mit Struktur in Coredata

- (void) encodeWithCoder: (NSCoder *) Encoder.

Aber ich immer diese Fehlermeldung

[NSKeyedArchiver encodeValueOfObjCType: in:]: Das Archivierungs nicht kodieren structs'

Was ist die beste Praxis diese Aufgabe zu Coredata zu speichern ist. Bitte hilf mir.

Antwort

6

Sie haben die Struktur in einem NSData wickeln können, dh

mit Archivierungs zu kodieren

[coder encodeObject:[NSData dataWithBytes:&my_struct length:sizeof(my_struct)] 
      forKey:@"my_struct"]; 

und mit Archivierungs

NSData *data = [coder decodeObjectForKey:@"my_struct"]; 
[data getBytes:&my_struct length:sizeof(my_struct)]; 
+0

mit DataWithBytes: Länge: ist nicht zwischen verschiedenen Endian oder 32/64 Bit-Plattformen. Wenn Sie dies verwenden, werden Ihre Daten an das angegebene Gerät angehängt und die Benutzer können nicht auf verschiedene Plattformen aktualisieren oder die Datei auf einer anderen Plattform als der, auf der sie erstellt wurde, übertragen/öffnen. –

+0

@Brent Sicher ... aber die Frage ist über iPhone und ich denke, das sollte für ein paar Jahre gut funktionieren ... und wenn Apple die Hardware ändern wird, glaube ich, (a) werden sie einen Zeitraum mit einem Emulator zu bringen haben so viel Software wie möglich (b) das Programm muss neu kompiliert werden und kann dann repariert werden (wenn nötig) ... und es ist nur ein Problem für "Daten", die auf einem Hardwaretyp erstellt/gespeichert werden Übertragen auf eine andere neue Architektur ... – epatel

+0

@epatel Ich habe Kunden auf PPC und Intel, die CoreData-Backup-Dateien zu/von einem iPhone übertragen. Diese Empfehlung hätte mir Kopfschmerzen bereitet, wenn ich es mir angehört hätte. Sie können ARM 6/7 Code für das iPhone erstellen, es ist kein Problem, in Zukunft an 32/64 Bit Fett-Binärdateien zu denken. Dies war ein "vorsichtiger" Kommentar, und ich empfehle die unten erwähnte NSCoder-Methode, die für immer sicher ist, nicht nur kurzfristig "für ein paar Jahre". –

1

Mit einer Struktur, denke ich, wäre es am besten, eine Funktion zu erstellen, die die Struktur kodieren und dekodieren kann, wie jedes Objective-C-Objekt.

Mit Enums bin ich mir nicht so sicher. Enums sind nur Zahlen, die einem Namen zugeordnet sind, also geben Sie sie einfach als Zahlen ein und dekodieren Sie sie.

4

Sie sollten eine benutzerdefinierte Implementierung des NSCoding haben zu entschlüsseln Protokoll in Ihrer benutzerdefinierten Klasse. In Ihren eigenen Implementierungen -[initWithCoder:] und -[encodeWithCoder:] können Sie dann die Strukturobjekte beliebig codieren/decodieren.

Auf diesem Weg wäre es, [coder encodeObject:[NSValue valueWithBytes:&yourStructVariable objCType:@encode(struct YourStructName)] forKey:@"someKey"]; in -[encodeWithCoder:] zu rufen und die entsprechende Decodierung in -[initWithCoder:] zu tun.

Sie können die Klassenobjekte dann einfach als transformierbar in Core Data speichern.

+1

Mit NSValue valueWithBytes wird die vom OP angegebene Ausnahme ausgelöst. –

Verwandte Themen