2012-09-06 10 views
8

enter image description here - Tengo una entidad Item y una entidad Tag. - Los elementos pueden tener múltiples etiquetas y etiquetas que se pueden vincular a varios elementos (de muchas a muchas relaciones). - La relación es una "Relación ordenada" (utilizando la relación ordenada en IOS5) en ambos sentidos.Datos principales: ¿Qué debo usar como un descriptor de ordenación con el conjunto ordenado (ios5) en una relación de muchos a muchos?

que queremos obtener todas las etiquetas hijo para un artículo dado

Im usando la siguiente petición de recuperación: devuelve datos de descriptores

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; 

// Fetch all items that have a given tag 
Tag* myTag = ....; 
request.predicate = [NSPredicate predicateWithFormat:@"ANY tag == %@", myTag]; 

// This is my attempt to get the correct sort ordering (it crashes) 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"tag" 
                   ascending:YES]; 
request.sortDescriptors = @[sortDescriptor]; 

la clase anterior (que supongo es en algún orden), pero luego accidentes:

[_NSFaultingMutableOrderedSet compare:]: unrecognized selector sent to instance 0x10b058f0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[_NSFaultingMutableOrderedSet compare:]: unrecognised selector sent to instance 0x10b058f0' 

Si doy una serie descriptores ordenar vacía, entonces no me llevo un accidente, pero el resultado no se ordena.

¿Cómo implemento correctamente el descriptor de ordenación en una relación de muchos a muchos utilizando la función de relación ordenada en ios5?

+0

¿Puedes aclarar qué entidad estás buscando instancias? Si está obteniendo instancias de 'Item', entonces el descriptor de ordenación debe determinar el orden de clasificación de' Item's y no tiene nada que ver con la relación ordenada 'Item' tiene que' Tag'. La excepción se debe a que su keyPath no termina en un atributo sino en un conjunto. Pruebe 'etiquetas. @ Count' por ejemplo en su lugar. –

+1

Tengo una consulta similar. En este caso, estoy buscando todos los elementos asociados con etiqueta (solicitud de búsqueda en entidad de artículo) y dado que etiqueta a artículo es una relación ordenada, quiero buscar elementos vinculados con etiquetas "en el orden" en que se guardó en la base de datos. Coredata no expone la tabla intermedia utilizada para mantener la relación ordenada, entonces, ¿cómo especificar eso en NSFetchedResultsController? – siasl

+0

Estoy intentando recuperar todas las instancias de elementos vinculados a una intancia de etiqueta en el orden en que se guardaron. Estoy imprimiendo la consulta SQL a la consola y si uso etiquetas como el descriptor de clasificación, puedo ver que el resultado está ordenado por una tabla intermedia, sin embargo, esto es interno a los datos centrales. ¿Hay alguna forma de especificar este orden usando el descriptor de clasificación? SELECCIONAR DISTINCT 0, t0.Z_PK FROM ZKDITEM t0 UNIRSE A Z_2TAGS t1 ON t0.Z_PK = t1.Z_2ITEMS WHERE t1.Z_4TAGS =? ORDER BY t1.Z_FOK_2ITEMS – Ash

Respuesta

15

Creo que puede estar entendiendo mal lo que significa una relación ordenada en Datos básicos. Según this question, "ordenado" no significa "con respecto a una propiedad"; en cambio, "ordenado" significa "conserva la orden del usuario" (u otro orden específico que de otra manera parecería arbitrario). Algunos ejemplos:

  • Un ordenada relación sería bueno para pasos de una receta (el ejemplo de Core Data Release Notes de Apple) - los pasos no necesariamente podría ser ordenados con respecto a cualquiera de sus propiedades (por ejemplo, su texto), y tendrían que mantener una propiedad de "índice" u "orden" por sí mismos si Core Data no hizo el pedido.
  • Una relación ordenada sería no servirá para una lista de nombres; el usuario podría elegir ordenar por nombre o apellido, por ejemplo, y la colección de nombres no tiene un orden intrínseco real internamente. Lo único que importa es mostrar orden: los datos en sí no necesitan mantener ese orden. (La regla de oro en la documentación de Apple es que si un usuario podría concebiblemente elegir entre los especificadores de ordenación, la relación no debe ser ordenado en la base de datos.)

En su caso, se intenta aplicar una especie descriptor al conjunto de conjuntos ordenados (los valores de la propiedad tags) que está buscando. Esta es la causa de su bloqueo: la subclase NSOrderedSet (_NSFaultingMutableOrderedSet, en su caso) no implementa el método -compare: que el descriptor de ordenamiento usaría para ordenarlos, y así obtiene esa excepción.

Creo que una buena solución para usted sería no usar un descriptor de ordenación; en su lugar, si desea cambiar el orden conservado para mostrar al usuario, obtenga el valor NSOrderedSet para tags en algún Artículo, luego obtenga una matriz con su propio orden usando -sortedArrayUsingComparator:. Esto mantendrá los datos en el orden correcto en Core Data pero le permitirá reordenar usted mismo programáticamente.

En un nivel superior, también puede considerar si realmente necesita orden en sus relaciones. Se incurre en una penalización de rendimiento significativa, y todo lo que realmente recuperas es el orden original en el que se agregaron las etiquetas a los elementos (o viceversa).Si tiene la intención de cambiar ese orden cada vez que muestra las etiquetas, está tomando ese rendimiento sin ningún beneficio real: desordene sus relaciones, continúe ordenando por programación o use un descriptor de clasificación en una clave agregada, como [email protected] , como se sugiere en los comentarios.

+0

Esta es una gran explicación. – mkral

+0

¡Gracias! Lo aprecio. – Tim

Cuestiones relacionadas