2011-02-06 11 views
12

Estoy escribiendo una aplicación para iOS que tiene tienda de registros de personas, y tiene que mostrar las listas de los clasificó de manera particular. Hay un número variable de estos pedidos, y se generan sobre la marcha, pero me gustaría que se almacenaran en el almacén de datos. La forma de SQL para hacer esto es tener una tabla de ListPositions con un nombre de lista, una identificación en la tabla de personas y una clave de clasificación. Luego, para mostrar una lista en particular, puedo seleccionar todas las ListPositions de la lista con un nombre de pila, atraer a las personas a las que se hace referencia y ordenarlas en la clave de clasificación. Intentando hacer esto en CoreDatat, sin embargo, tengo problemas. Estoy tratando de hacer esto utilizando un esquema como:CoreData especie en relación a muchos

Person: 
    Name 
    DOB 
    etc... 
    positions -->> ListPosition 

ListPosition: 
    listName 
    sortKey 
    person --> Person 

Entonces, puedo conseguir todas las personas en una lista dada con el NSPredicate [NSPredicate predicateWithFormat:@"ANY positions.listName like %@", someList]; Esto me permite agregar dinámicamente listas contra un gran conjunto de personas. El problema es que no puedo usar el campo sortKey de ListPosition para ordenar las Personas. ¿Qué NSSortDescriptor hará esto? Y si no es posible ordenar una búsqueda en la propiedad de un elemento de una relación de muchos, ¿cuál es otra forma de obtener ordenamientos múltiples y dinámicos en coredatos? Estoy mostrando las listas con NSFetchedResultsController, por lo que no puedo poner las listas juntas en la memoria. Necesito hacerlo con una sola NSFetchRequest.

+0

un formato más agradable sería mucho más fácil leer su pregunta. – vikingosegundo

+0

nos dan código de ur! – vikingosegundo

Respuesta

3

Estás derecha- siguiendo una relación a muchos devuelve un NSSet, que no tiene clasificación inherente. Para obtener resultados ordenados hay un par de opciones:

  1. Suponiendo que Person/ListPosition es una relación bidireccional, realice una nueva solicitud de búsqueda para las entidades ListPosition. Haga que el predicado coincida con la relación "persona" de ListPosition, que se parecería a [NSPredicate predicateWithFormat:@"person=%@", myPerson]. Usa el descriptor de ordenación que necesites en la solicitud de búsqueda.
  2. Siga la relación como lo hace, lo que le otorga un NSSet. Luego use el método -sortedArrayUsingDescriptors: de NSSet para convertir eso a una matriz ordenada.
+0

No estaba claro. Mi problema no es cómo ordenar los objetos en una relación a varios, sino más bien cómo proporcionar muchos ordenamientos diferentes para un gran conjunto de objetos. He editado la pregunta. – wombat57

1

Creo que el mejor enfoque en este caso sería buscar en la entidad ListPosition en su lugar. Agregue el Descriptor de clasificación para sortKey (funcionaría en este caso porque la solicitud de búsqueda está en la entidad ListPosition) y capte previamente la persona asociada con el nombre de la lista usando setRelationshipKeyPathsForPrefetching para "persona" en la solicitud de búsqueda.

[NSPredicate predicateWithFormat:@"listName like %@", someList]; 
+0

Esto funciona, sin embargo, si realiza alguna modificación en el objeto Persona, no activará NSFetchedResultsController para actualizar ya que la posición de la lista no cambió. –

1

Si entiendo correctamente su modelo, cada uno tiene PersonListPosition para cada lista en la que participa. Digamos que la lista que hemos acsending por sus nombres, para que la gente X tienen puestos en las listas X con la misma listName y sortKey.

Crearía la entidad List, que contendría el atributo sortKey y luego la usaría en el descriptor de ordenación.

entity List: 
    - sortKey : string 
    - ascending : bool 

Crear descriptor de clase y utilizarlo en petición de recuperación:

[NSSortDescriptor sortDescriptorWithKey:chosenList.sortKey ascending:chosenList.ascending]; 

entonces usted puede tener tantas listas como desee y que pueda usar su clave de ordenación para ordenar todas las personas.


Si desea almacenar las posiciones en la base de datos (que no ha mencionado atributo index en su ListPosition, o algo similar), puede crear “entidad conjunta”:

entity PersonInList: 
    - index : integer 
    - person -> Person 
    - list –> List 

Otra idea es haber ordenado un conjunto de objetos Person directamente en la entidad List.

0

Normalmente agrego un campo de índice (tipo NSNumber) a una entidad. Es muy fácil calcular el índice al agregar un ítem. solo por

object.index = person.positions.count 

por lo que, en realidad, no necesita el campo de posiciones sino la relación de posiciones. conectar persona entidad a la entidad ListPosition sería suficiente.

1

Obtenga la ListPosition (vendrá como un NSMutableSet). A continuación, hacer una especie en el set, así:

NSMutableSet *positionsSet = [personEntity mutableSetValueForKey:@"positions"]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"yourSortKey" ascending:NO]; 
NSArray *positionsSortedSet = [positionsSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

qué le dará una matriz ordenada de acuerdo con su clave.

Cuestiones relacionadas