2009-07-04 20 views
7

Estoy empezando a usar Core Data en el SDK de iPhone y estoy buscando guardar una lista ordenada, algo así como una matriz. Sin embargo, las relaciones en los datos principales se expresan como conjuntos cuando se recuperan. Esto hace que sea difícil guardar el orden en que se colocan los objetos.Relaciones indexadas en Core Data

Un buen ejemplo serían los elementos de datos en la vista de tabla cuando se permite reordenar los artículos. Una solución fácil sería incluir una propiedad de índice en el objeto gestionado.

Considere la siguiente jerarquía:

Documento < -Muchos-a-muchos-> DataItem

diferentes instancias documento podría vincular a la misma DataItem, y cada documento puede hacer referencia a uno o más DataItem (s) . Por lo tanto, tener una propiedad de índice en DataItem daría lugar a una menor reutilización de esa instancia, es decir, solo puede guardar el índice para una instancia de Documento.

¿Alguna idea de cómo puedo presentar la jerarquía perfectamente ordenada en una vista de tabla pero aún mantener cada instancia de DataItem reutilizable? ¡Gracias!

Respuesta

3

Una buena solución es mantener una estructura de datos separada en el documento para asignar elementos de datos a una posición en la vista de tabla. Además de permitir que el mismo DataItem exista en múltiples posiciones, si necesita agregar un DataItem a múltiples documentos, esta solución también funcionará.

Cuando estaba viendo las diferentes estrategias para mantener los objetos Core Data ordenados, encontré un blog post que explica cómo hacerlo en gran detalle, incluido el código de muestra también.

7

Usted puede hacerlo con otra entidad, como esto: alt text http://gallery.me.com/davedelong/100084/Screenshot-20on-202009-07-04-20at-2010-34-56-20AM/web.jpg?ver=12467253090001

Un documento podría encontrar su dataItems reales mediante el uso de algo como esto:

NSSet * documentDataItems = [[document orderedDataItems] valueForKey:@"dataItem"]; 

Del mismo modo, un DataItem pudo encontrar todos sus documentos haciendo lo mismo:

NSSet * dataItemDocuments = [[dataItem orderedPositions] valueForKey:@"document"]; 
+0

La imagen parece estar rota. –

+0

@BJ Homer - gracias; Aparentemente twitpic no le gusta la vinculación estática. Lo cargué en MobileMe en su lugar. –

15

A partir de OS X Lion (10.7) esto es ahora mucho más sencillo. Cocoa ahora es compatible con una nueva clase NSOrderedSet que es compatible con Core Data. Esta funcionalidad también está disponible en iOS aunque requiere iOS 5.0 o posterior. Esto significa que no se puede usar si desea que su aplicación sea compatible con versiones anteriores de iOS o OS X.

Todo lo que necesita hacer para obtener un pedido es abrir el editor de modelos de Core Data, seleccionar uno para -Mucha relación y marca la casilla de verificación "ordenado".

+0

¿Conoces alguna documentación sobre esta nueva API? Solo lo he visto oficialmente discutido en las notas de la versión. Me gustaría averiguar, por ejemplo, sobre la visualización de registros por este orden en una vista de tabla – Dov

+0

. Hay un enlace en mi respuesta original a la referencia de clase de NSOrderSet. Sin embargo, no conozco nada específicamente relacionado con los mejores casos de uso dentro de las vistas de tabla. –

+1

'NSOrderedSet' no se puede usar actualmente junto con iCloud tampoco. –