2012-02-16 9 views
7

Estoy tratando de establecer un modelo simple de datos básicos como la siguiente:del modelo y de poblar la base de datos de muchos-a-muchos relación con el atributo

Order(code, customer) 
Book(code, title, price) 
OrderBook(order_code, book_code, quantity) 

De la documentación de Datos Básicos veo que no es posible modele una relación de muchos a muchos agregándole atributos. Por esta razón, lo modelé como el siguiente.

enter image description here

donde:

  • Order-OrderBook existe una relación uno-a-muchos con una regla de supresión Cascade
  • forma OrderBook a Order hay una relación de uno a uno con una regla de eliminación No Acción

Lo mismo es válido para Book y OrderBook.

Primera pregunta: ¿Es este modelo válido?

Suponiendo que el modelo está bien, creé las subclases NSManagedObject correspondientes.

Book.h/.m 
Order.h/.m 
OrderBook.h/.m 

Dicho esto, tengo la necesidad de completar el db correspondiente por medio del mecanismo de datos básicos. Para hacer esto, creé las categorías correspondientes como las siguientes, donde cada categoría es responsable de crearse a sí misma (para mantener la encapsulación de objetos).

Book+Creation.h/.m 
Order+Creation.h/.m 
OrderBook+Creation.h/.m 

Por ejemplo Book+Creation categoría tiene un método de clase como la siguiente:

+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context; 

ahora tengo un problema y no sé cómo resolverlo.

La población modelo tiene que suceder en diferentes momentos. La tabla de libros está poblada primero (estoy creando un catálogo de libros de un archivo xml). Una vez que termine, puedo completar las tablas de orden y libro de órdenes. Para rellenar estas tablas que estoy usando un archivo XML como el siguiente:

<orders> 
    <order> 
    <code>1234</code> 
    <book>2567</book> 
    <customer>299</customer> 
    <quantity>4</quantity> 
    </order> 
</orders> 

Para crear un objeto gestionado Order He creado el siguiente método en su categoría Order+Creation:

+ (Order *)orderWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context; 

Una vez creado, el objeto se pasa a la categoría OrderBook+Creation método de clase para crear un objeto gestionado OrderBook:

+ (OrderBook *)orderWithXMLElement:(GDataXMLElement *)xmlElement withOrder:(Order*)order inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    OrderBook* orderBook = [NSEntityDescription insertNewObjectForEntityForName:@"OrderBook" inManagedObjectContext:context]; 
    orderBook.order = order; 
    //orderBook.book = <-- how can I retrieve the book? 

    return orderBook; 
} 

Lo que falta es cómo crear (o recuperar) el objeto Book para asignarlo al objeto OrderBook.

Segunda pregunta: ¿Cómo puedo recuperar un objeto Book y asignarlo a OrderBook? ¿Debo crear un NSFetchRequest para obtener el objeto correcto Book (el que tiene el mismo código en el archivo xml, por ejemplo, <book>2567</book>)? Si es así, ¿hay un mecanismo para mejorar el rendimiento de la búsqueda de búsqueda?

Recuerde que la tabla de libros ya está llena.

Espero que esté claro. Gracias de antemano.

+0

Lo siento, pero ¿por qué downvote? –

+0

Con su modelo actual, si tiene un objeto de libro de pedidos que tiene un atributo de libro y orden, si elimina el libro o el pedido, se eliminará el objeto del libro de pedidos. ¿Es eso lo que quieres? – jrturton

+0

@jrturton gracias por su respuesta. Sí, es lo que quiero. ¿Tienes alguna sugerencia? –

Respuesta

3
  1. Debería ser "anular" no "no hay acción" para las relaciones de uno a uno.
  2. Sí, tienes razón, necesitas una solicitud de recuperación.

Si tiene problemas de rendimiento con la solicitud de búsqueda (difícil de decir sin conocer los números) podría recuperar todo el conjunto de libros en la memoria (de nuevo, podría no ser práctico según los números) y luego usar el filtrado/enumeración de array para encontrar el elemento específico, pero definitivamente debe construir y perfilar la opción más simple primero.

Los tipos de reglas de eliminación se describen here, anular es correcto para la relación a uno de cartera de pedidos para reservar y Orden:

Nulidad

Establecer la relación inversa de los objetos en el destino anular

Por ejemplo, si elimina un departamento, configure el departamento para todos los miembros actuales como nulo. Esto solo tiene sentido si la relación departamental para un empleado es opcional, o si se asegura de que establezca un nuevo departamento para cada uno de los empleados antes de la siguiente operación de guardado.

Esto significa que si elimina un orderBook, entonces se elimina de los conjuntos orderBooks y bookOrders en las entidades Order y Book.

+0

Gracias. La población de tabla se realiza en segundo plano por medio de una operación NSO. ¿A qué te refieres con "definitivamente debes construir y perfilar primero la opción más simple"? +1 por su apoyo. –

+1

Es decir, escríbalo con una solicitud de recuperación (solo tienes que crearlo una vez, puedes modificar el predicado) y usar el objeto de libro devuelto al completar tu pedido. No intente nada más hasta que, a menos que esto cause problemas. – jrturton

+0

Una pregunta simple para usted. ¿Es correcto que ** de OrderBook a Order haya una relación de uno a uno con una regla de eliminación No Action ** ?. Cuando configuro esto, el compilador me da un Error de consistencia. Tal vez si uso la regla NULLIFY podría ser más correcto. ¿Qué piensa usted acerca de? Gracias. –

Cuestiones relacionadas