Esto puede parecer estúpido, pero todavía no pude averiguar cómo marcar un atributo como clave principal en el archivo xcdatamodel. Mi almacenamiento persistente es un archivo sqlite. ¿Alguien puede ayudarme?
En ese caso, ¿cómo puedo "validar" una identificación para que sea única? ¿Debo escribir un método de validación o algo así?
iphone
cocoa-touch
core-data
Mugunth
fuente
fuente
Tenga en cuenta que Core Data es un marco de persistencia de gráficos de objetos, no una base de datos. Cosas como las claves primarias se abstraen porque dependen de la implementación del almacén persistente.
fuente
Core Data crea su propia clave principal, no es necesario que agregue una. Puedes recuperarlo con
NSManagedObjectID *moID = [managedObject objectID];
fuente
a veces, al piratear, se necesita el int real de la clave principal. así es como uno puede agarrarlo:
NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID]; int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];
a pesar de que CoreData es un gráfico de objetos, si uno mira los datos de la base de datos SQLite generados por CoreData, esta forma de obtener la clave principal de un NSManagedObject no debería ser un problema. He usado CoreData y la biblioteca C sqlite3 de bajo nivel juntas en el mismo código y pasar las claves primarias de CoreData a sqlite3 para obtener registros funciona bien.
! Si tiene la intención de usar este código en producción, tenga en cuenta los posibles cambios internos en la forma en que la clave principal de db se transforma en una representación URIR, podría frenar su código.
disfrutar
fuente
Sin hackear NSManagedObjectID, puede realizar una verificación rápida de su atributo antes de administrar su recopilación de datos remota.
He creado un método de utilidad, compruébalo aquí
fuente
Una extensión Swift para recuperar la clave principal
extension NSManagedObject { var primaryKey : String { guard objectID.uriRepresentation().lastPathComponent.count > 1 else { return "" } return objectID.uriRepresentation().lastPathComponent.substring(from: 1) } }
Y para String
extension String { func substring(from : Int) -> String { guard self.count > from else { return "" } return String(self[self.index(self.startIndex, offsetBy: from)...]) } }
fuente
Prefiero usar Time + el nombre de la clase como identificador único.
fuente