objective - iPhone: guarde booleano en Core Data
ios 12 core data (3)
Como un enfoque alternativo a la respuesta aceptada, puede simplemente cambiar el tipeo de un NSNumber * a un BOOL en la definición de la interfaz de objetos gestionados, como por ejemplo:
@property (nonatomic) BOOL useGPS; // Notice that the ''retain'' is also removed as we''re now dealing with a scalar rather than an NSObject
here se discuten varios enfoques alternativos, pero la respuesta de Chris Hanson fue muy esclarecedora para mí, especialmente:
Si tiene un atributo numérico (incluido un atributo booleano) que se requiere, puede simplemente escribirlo como un escalar y Core Data hará lo correcto:
@property (no atómico) BOOL isDone;
Incluso si el atributo es opcional, eso funcionará, simplemente combinará "no presente" con "falso".
y para una implementación de Cacao más alineada:
Otra cosa que podría querer hacer es nombrar la propiedad "hecho" y simplemente especificar el getter como "isDone". Esa es la convención de nombres de Cocoa habitual:
@property (nonatomic, getter = isDone) BOOL hecho;
Luego puede escribir "if (item.done) {...}" o "item.done = NO;" y el compilador generará aún -isDone para acceder a la propiedad.
Gracias Chris, y espero que esto ayude a alguien.
Configuré uno de mis atributos de datos centrales como booleano. Ahora, tengo que configurarlo, pero XCode sigue diciéndome que puede no responder a setUseGPS.
[ride setUseGPS: useGPS.on];
¿Cuál es el método para establecer un booleano en los datos centrales? Todos mis otros atributos están establecidos de esta manera, y funcionan muy bien. Entonces, ¿no estoy seguro de por qué un booleano no funciona para establecerse de esta manera?
Core Data "no tiene" un tipo booleano (lo hace, pero es un NSNumber).
Entonces para establecer el equivalente de useGPS = YES.
[entity setUseGPS:[NSNumber numberWithBool:YES]];
Y a la inversa:
BOOL isGPSOn = [[entity useGPS] boolValue];
Actualización: como señala SKG, con los literales en Objetive-C ahora puede hacerlo de una manera más simple:
[entity setUseGPS:@YES];
BOOL isGPSOn = entity.useGPS.boolValue;
La "solución" para esto (en mi humilde opinión, es un error en el SDK de Apple) es agregar el siguiente código a su clase generada por CoreData. NB: si haces esto en una categoría, en un archivo separado, entonces no tienes que volver a copiar / pegar cada vez que regeneras las clases de CoreData dentro de Xcode
- (BOOL)useGPS
{
[self willAccessValueForKey:@"useGPS"];
BOOL myuseGPS = [[self primitiveUseGPS] boolValue];
[self didAccessValueForKey:@"useGPS"];
return myuseGPS;
}
- (void)setUseGPS:(BOOL)newValue
{
[self willChangeValueForKey:@"useGPS"];
[self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]];
[self didChangeValueForKey:@"useGPS"];
}