2011-03-22 14 views
5

¿Cuál es el mejor método para almacenar UUID (para identificación de objetos multisistema global) en Core Data? Teniendo en cuenta el tamaño de almacenamiento y las capacidades de indexación.Almacenamiento de UUID en Core Data

Idealmente se almacenaría como datos binarios (en 128 bits), pero ¿hay algún problema inmediato al hacerlo? Sería más eficiente almacenarlo de esta manera que como un NSString, pero solo quiero verificar que no haya problemas de rendimiento al almacenar esto como datos binarios. ¿Aún se indexará correctamente como datos binarios? ¿Hay alguna desventaja al almacenar lo que es efectivamente datos binarios de ancho fijo en un campo de ancho variable?

No estoy demasiado familiarizado con SQLite y sus mecanismos de almacenamiento/indexación, ¡así que quería buscar algunos consejos!

+0

¿Cuál es exactamente el problema con el uso del tipo de GUID incorporado? Obviamente, no desea almacenar un UUID como una cadena, pero hay un tipo de base de datos específico para esto. –

+0

No hay ningún tipo de atributo GUID en Core Data. Si con GUID te refieres a los ID de objeto administrado creados por Core Data, esta no es una opción porque los ID deben ser persistentes y únicos en varios sistemas dispares. –

Respuesta

3

¿Cuántas de estas planea almacenar? Almacenarlos como datos binarios ahorra aproximadamente el 50% - aproximadamente 20 bytes como datos binarios contra aproximadamente 40 bytes como una cadena. Así que estás hablando de ahorrar 20K por cada mil UUID, lo cual no es tanto como para preocuparme de ninguna manera. Sin embargo, si realmente desea guardarlos como datos binarios, puede hacerlo almacenándolos como objetos NSData.

+0

¿Sabe si los campos de "datos binarios" son indexables correctamente? –

+0

¿Ha establecido el indicador "Indizado" para ese atributo en su modelo? – Caleb

+0

Sí, eso está marcado. Solo me pregunto sobre cualquier problema interno o cosas que deba saber sobre el almacenamiento y la indexación de pequeños blobs. –

0

Guardo mi UUID como "Transformable" y funciona bien.

  1. Agregue esto a su NSManagedObject subclase: @NSManaged var uuid: NSUUID!

  2. en su modelo de datos central (archivo .xcdatamodel), crear un atributo con el nombre uuid con el tipo Transformable

obras Consulta de también, escribo mis predicados para buscar en ellos de esta manera:

request.predicate = NSPredicate(format: "uuid == %@", withUuid)

6

A partir de iOS 11, puede establecer el atributo UUID directamente en el editor de datos centrales. UUID se almacenará como binario automáticamente.

enter image description here

luego Puedes recoger tus objetos de datos utilizando Core UUID (en Obj-C, NSUUID).

static func fetch(with identifier: UUID) -> AudioRecord? { 
    var record: AudioRecord? 
    moc.performAndWait { 
     let fetchRequest = AudioRecord.request 
     fetchRequest.predicate = NSPredicate(format: "identifier == %@", identifier as CVarArg) 
     fetchRequest.fetchLimit = 1 
     record = (try? fetchRequest.execute())?.first 
    } 
    return record 
} 
+0

¿Tengo que establecer el valor 'identificador', o se creó automáticamente para mí? – matt

+0

@matt necesita configurar el 'identificador' manualmente. – Jonny

+0

Estoy de acuerdo, parece comenzar la vida como nula. Parece una tontería, ya que es obvio lo que significa tener un uuid, pero ya tenía un código para configurar el uuid, así que no es un trabajo extra. ¡Gracias! – matt