ios - requiere - mdm google
Error de la base de datos escalar solo en algunos dispositivos (3)
¡No olvides probar un "Limpio"! Eso me lo arregló aunque había eliminado la aplicación de mi dispositivo.
He estado probando principalmente con iPhone 6, 6 plus y iPad. Acabo de probar mi aplicación hoy en el simulador de iPhone 5 y obtuve un error de Core Data.
CoreData: error: la propiedad ''setId:'' es un tipo escalar en la clase ''AppName.EntityName'' que no coincide con el tipo escalar de la propiedad de la entidad. Los accesores generados dinámicamente no admiten la coacción de tipo implícita. No se puede generar un método setter para ello.
Ahora, no hay ningún objeto ''setId'' en mi aplicación, pero, por supuesto, la entidad tiene un objeto ''ID'', que se establece como un int.
class Entity: NSManagedObject {
@NSManaged var id: Int
}
En el modelo Core Data, el tipo de atributo se establece en Integer64. Ese podría ser mi problema, ya que elegí eso sin saber qué era lo mejor. Tengo otros atributos en el modelo y en la clase, pero todos son cadenas.
Buscando una solución y una explicación de por qué esto sucede solo en algunos dispositivos, ¡así puedo aprender!
Alternativamente, puede escribir su propio método setter / getter que transforma el Int
en una instancia NSNumber
y lo pasa al valor primitivo . P.ej:
private(set) var publicId: Int {
get {
self.willAccessValueForKey("publicId")
let value = self.primitivePublicId.longValue
self.didAccessValueForKey("publicId")
return value
}
set {
self.willChangeValueForKey("publicId")
self.primitivePublicId = NSNumber(long: newValue)
self.didChangeValueForKey("publicId")
}
}
@NSManaged private var primitivePublicId: NSNumber
Si el tipo de Core Data es Integer 64, entonces debe declarar la propiedad como Int64
(o dejar que Xcode cree la subclase de objeto administrado).
Int
puede ser de 32 o 64 bits, dependiendo de la arquitectura del procesador.
Alternativamente, defina la propiedad como NSNumber*
lugar de una propiedad escalar. Por supuesto, debe tener cuidado de que en una plataforma de 32 bits los valores no excedan el rango de Int
.