users standard how cocoa core-data save nsuserdefaults

cocoa - standard - Guarde las entidades CoreData en NSUserDefaults



userdefaults standard swift 4 (3)

No querrá intentar archivar una entidad de datos central y almacenarla. En su lugar, debe almacenar la clave o algún otro atributo conocido y usarlo para recuperar la entidad cuando se inicia la aplicación.

Algunos ejemplos de código (ligeramente modificado del ejemplo publicado en la Guía de programación de datos básicos ):

NSManagedObjectContext *moc = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"SearchEngine" inManagedObjectContext:moc]; NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; [request setEntity:entityDescription]; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"engineName LIKE[c] ''%@''", selectedEngineName]; [request setPredicate:predicate]; NSError *error = nil; NSArray *array = [moc executeFetchRequest:request error:&error]; if (array == nil) { // Deal with error... }

De esta forma, guarda el nombre en los valores predeterminados del usuario y busca la entidad cuando sea necesario.

Imagine una entidad CoreData (por ejemplo, named searchEngine ).
NSManagedObjectContext administra algunas "instancias" de esta entidad.
El usuario final podrá seleccionar su "standard searchEngine" con un NSPopupButton .
El selected object de NSPopupButton debe vincularse a NSUserDefaults.
El problema:

1) @try {guardar}

a) Si intenta guardar la "instancia" seleccionada directamente en NSUserDefaults, aparece algo como esto:

-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '' (entity: searchEngine; id: 0x156f60 ; data: { url = "http://google.de/"; someAttribute = 1; name = "google"; })'' of class ''searchEngine''.

b) Si intentas convertir la "instancia" a NSData viene esto:

-[searchEngine encodeWithCoder:]: unrecognized selector sent to instance 0x1a25b0

¿Alguna idea de cómo obtener estas entidades en una información compatible con plist?

2) @try {registerDefaults}

Por lo general, el método registerDefaults: se implementa en + (void)initialize . El problema aquí es que se llama a este método antes de que CoreData cargue las entidades guardadas de su base de datos. Entonces no puedo establecer un valor predeterminado para un objeto que no existe, ¿verdad?

Sé, preguntas largas ... pero: prueba {[me proporciona: detalles]}; D


Si necesita almacenar una referencia a un objeto gestionado específico, use la representación URI de su ID de objeto gestionado:

NSURL *moIDURL = [[myManagedObject objectID] URIRepresentation];

A continuación, puede guardar la URL a los valores predeterminados del usuario.

Para recuperar el objeto gestionado, utiliza:

NSManagedObjectID *moID = [myPersistentStoreCoordinator managedObjectIDForURIRepresentation:moIDURL]; NSManagedObject *myManagedObject = [myContext objectWithID:moID];

La única advertencia es que debe asegurarse de que el ID del objeto gestionado original sea permanente: esto no es un problema si ya ha guardado el objeto, o puede usar obtener los obtainPermanentIDsForObjects:error:


Esta es la forma más limpia y más corta de hacer esto actualmente usando los métodos setURL y getURL agregados en 4.0 para evitar llamadas adicionales a NSKeyedUnarchiver y NSKeyedArchiver:

Setter:

+ (void)storeSomeObjectId:(NSManagedObjectID *)objectId { [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] forKey:@"someObjectIdKey"]; [[NSUserDefaults standardUserDefaults] synchronize]; }

Adquiridor:

+ (SomeManagedObject *)getObjectByStoredId { NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"]; NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri]; SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId]; }