¿Usando una forma concisa de NSManagedObjectID URI?

En mi aplicación, estoy usando Core Data junto con una database sqlite adicional que no usa Core Data. En esta database adicional, tengo columnas que almacenan references a NSManagedObject instancias de NSManagedObject través de NSManagedObjectID cada instancia.

objectId una instancia como una cadena de almacenamiento como esta:

 instance.objectID.URIRepresentation.absoluteString 

Esto da como resultado una cadena que parece algo así:

 x-conetworkingata://EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4/ClassName/p658 

Lo cual luego puedo usar para search la instancia de NSManagedObject así:

 [persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:uriString]]; 

Como estas cadenas de URI son verbosas y contienen información networkingundante, quisiera save solo el aspecto único de cada una para ahorrar espacio en la database y mejorar el performance de las consultas. Entonces, en el ejemplo anterior, solo '658' en lugar de la cadena de URI completa.

Entonces, la primera pregunta es: ¿qué es una buena manera de extraer solo la queue única de un NSManagedObjectID ? Y en segundo lugar, una vez que tengo eso almacenado, ¿cómo puedo usarlo más adelante para search la instancia?

Me gustaría evitar la manipulación de strings, ya que se siente mal, pero lo consideraré si es la única manera. Mi única confusión es que la parte 'EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4' proviene del ejemplo anterior. ¿Cómo podría acceder a ese valor para rebuild un URI válido?

Podría intentar configurar el indicador "Permitir almacenamiento externo" en los attributes que contienen sus grandes trozos de datos, y ver si eso elimina la necesidad de una database separada, administrada directamente.

De lo contrario, la representación URIRepresentation devuelve un NSURL , por lo que no es necesaria ninguna manipulación de cadenas "icky". Solo usa los methods NSURL . ; ^) Así es como lo descompone:

 NSURL *instanceURL = instance.objectID.URIRepresentation; NSURL *classURL = [instanceURL URLByDeletingLastPathComponent]; NSString *classString = [classURL absoluteString]; NSString *instanceId = [instanceURL lastPathComponent]; 

Y así es como lo reconstruyes más tarde:

 NSURL *reconstructedClassURL = [NSURL URLWithString:classString]; NSURL *reconstructedInstanceURL = [reconstructedClassURL URLByAppendingPathComponent:instanceId]; NSManagedObjectID *objectID = [moc.persistentStoreCoordinator managedObjectIDForURIRepresentation:reconstructedInstanceURL]; NSManagedObject *reconstructedInstance = [moc objectWithID:objectID]; 

Tenga en count que dado que la representación de URIRepresentation está documentada como "archivable", no hay ningún daño en rebuild una de los componentes que le fueron proporcionados por Core Data. Core Data no sabe que lo desarmó y lo reconstruyó.

Sin embargo, Apple tiene permitido cambiar el formatting devuelto por URIRepresentation en el futuro, siempre que managedObjectIDForURIRepresentation: continúe aceptando el formatting antiguo. Eso significa que el código anterior rompe la URIRepresentation podría dejar de funcionar algún día.