Tengo un NSArray de objetos personalizados que deseo guardar y restaurar. ¿Se puede hacer esto con NSUserDefaults?guardar y restaurar una matriz de objetos personalizados
Respuesta
Objetos personalizados, no. NSUserDefaults solo conoce unos pocos tipos básicos (NSData, NSString, NSNumber, NSDate, NSArray o NSDictionary).
¿Podría usar JSON (http://code.google.com/p/json-framework/) para convertir su objeto personalizado a una representación de cadena, y luego guardar una matriz de esos en Predeterminados? (Usando el método setObject: forKey:)
De lo contrario, podría utilizar el uso de sqlite, NSCoder, o incluso recurrir a fopen.
Aunque estoy usando objetos personalizados, se almacenan en NSArray, que es lo que intento guardar. ¿No debería funcionar entonces? –
Si por "¿No debería funcionar?" quieres decir "¿No puedo almacenar objetos personalizados en un NSArray?" la respuesta es sí. Si quieres decir "¿No puedo almacenar la matriz de objetos personalizados en NSUserDefaults?" entonces la respuesta es no, porque NSUserDefaults no puede almacenar objetos arbitrarios. – Chuck
ugh! JSON? Cuando hay un protocolo NSCoder perfectamente bueno? – Abizern
NSUserDefaults
no puede escribir objetos personalizados para presentar, únicos que dispone de información (NSArray
, NSDictionary
, NSString
, NSData
, NSNumber
y NSDate
). En su lugar, debería echar un vistazo al Archives and Serializations Programming Guide, así como también al NSCoding Protocol Reference, si está buscando guardar y restaurar objetos personalizados en el disco. Implementar el protocolo no es terriblemente difícil y requiere muy poco trabajo.
Todavía puede usar NSUserDefaults si archiva su matriz en NSData
.
para el archivo de la matriz, puede utilizar el siguiente código:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"mySavedArray"];
Y a continuación, para cargar los objetos personalizados en la matriz se puede utilizar este código:
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *savedArray = [currentDefaults objectForKey:@"mySavedArray"];
if (savedArray != nil)
{
NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
if (oldArray != nil) {
customObjectArray = [[NSMutableArray alloc] initWithArray:oldArray];
} else {
customObjectArray = [[NSMutableArray alloc] init];
}
}
Asegúrese de verificar que los datos devueltos por los valores predeterminados del usuario no son nil
, ya que pueden bloquear su aplicación.
La otra cosa que tendrá que hacer es hacer que su objeto personalizado cumpla con el protocolo NSCoder
. Puede hacer esto usando los métodos -(void)encodeWithCoder:(NSCoder *)coder
y -(id)initWithCoder:(NSCoder *)coder
.
EDIT.
Aquí hay un ejemplo de lo que podría poner en los métodos -(void)encodeWithCoder:(NSCoder *)coder
y -(id)initWithCoder:(NSCoder *)coder
.
- (void)encodeWithCoder:(NSCoder *)coder;
{
[coder encodeObject:aLabel forKey:@"label"];
[coder encodeInteger:aNumberID forKey:@"numberID"];
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [[CustomObject alloc] init];
if (self != nil)
{
aLabel = [coder decodeObjectForKey:@"label"];
aNumberID = [coder decodeIntegerForKey:@"numberID"];
}
return self;
}
- 1. Android guardar una matriz de objetos personalizados
- 2. Guardar y restaurar CGContext
- 3. Guardar y restaurar geometrías en OpenLayers
- 4. Guardar y restaurar aplicaciones y diseño
- 5. guardar y restaurar variables de shell
- 6. Guardar y restaurar el estado de vim
- 7. arrastrar y soltar objetos personalizados
- 8. Guardar y restaurar el estado expandido/contraído de una ExpandableListActivity
- 9. Guardar y restaurar ver estado android
- 10. ¿Cómo guardar y restaurar un formulario?
- 11. contenteditable texto seleccionado guardar y restaurar
- 12. Crear una matriz en javascript de objetos personalizados
- 13. Filtrar una NSArray que contiene objetos personalizados
- 14. Guardar y restaurar la posición y el tamaño del formulario
- 15. Guardar y restaurar el estado contraído de ExpandableListActivity con SimpleCursorTreeAdapter
- 16. Guardar el estado de WebView y restaurar en ANDROID
- 17. Guardar y restaurar la posición de intercalación para contentEditable div
- 18. Objetos personalizados persistentes
- 19. Cómo guardar y restaurar la posición de ListView en Android
- 20. WPF GridSplitter - guardar y restaurar la ubicación AND dividir proporcionalmente
- 21. ¿Es posible crear un script para guardar y restaurar permisos?
- 22. ¿Cómo puedo almacenar una lista de arrays de objetos personalizados?
- 23. Guardar CvSeq en una matriz
- 24. GSON: deserialización de objetos personalizados
- 25. guardar una matriz activa registros
- 26. inicializar una matriz de objetos
- 27. Consultar una matriz de objetos
- 28. delete [] una matriz de objetos
- 29. Usando el controlador mongo C#, ¿cómo serializar una matriz de objetos personalizados para almacenarlos?
- 30. Fabric.js - cómo guardar lienzo en el servidor con atributos personalizados
¿Hubo alguna respuesta correcta aquí? – Joshua
@Joshua, gracias por proporcionar el código de ejemplo, es muy útil. – trillions