2009-09-19 21 views
6

He venido a una barricada en mi proyecto actual. Tengo básicamente una aplicación que es muy similar a la aplicación de recetas de Datos Básicos ... Esta es la estructura básica que tengo en mi .xcdatamodelNecesito ayuda con las relaciones de muchos a muchos en los datos básicos para iPhone

Entidad: Restaurante cadena: nombre del : Categoría < ---- a relación -muchos

Entidad: Categoría cadena: nombre del restaurante: restaurante < -----a-muchos relación Así que, básicamente, un restaurante puede tener varias categorías ... Y hay una serie de categorías predefinidas const .. Por ejemplo: Restaura nt: Nombre: Chili's Categorías: Take Out, Family Dining

"Take Out" y "Family Dining" son 2 de 10 posibles categorías diferentes. ¿Cómo hago esto? He buscado en la base de datos sqllite y tengo mi ZRestaurant y tabla ZCategory + la tabla de unión para ambos ... Tengo datos en ambos ...

Cómo hacer Voy sobre la configuración de mi categoría de restaurantes con los diferentes valores? y luego ¿cómo puedo recuperarlos?

¡Gracias a todos! Kurt

Respuesta

5

OK, después de trabajar en esto durante los últimos 2 días que finalmente ocurrió con mi solución que en realidad era una mezcla entre Sugerencias de Alex y Wills ... ¡Gracias a los dos!

Aquí es lo que tengo ...

NSManagedObjectContext *context = [restaurant managedObjectContext]; 


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Category" inManagedObjectContext:context]]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSError *error = nil; 
NSArray *possibleCategories = [context executeFetchRequest:fetchRequest error:&error]; 

categoryArray = [[NSMutableArray alloc] initWithArray:possibleCategories]; 

currentCategories = [restaurant valueForKeyPath:@"categories"]; 

[restaurant addCategoriesObject:(Category *)[possibleCategories objectAtIndex:15 ]]; 

[currentCategories addObject:(Category*)[categoryArray objectAtIndex:15]]; 

y luego guardar como esto

- (void)save{ 
    NSLog(@"EditCatagoriesTableViewController - save"); 

    NSSet* myCategorySet = [[NSSet alloc] initWithSet:currentCategories]; 

    NSError *error = nil; 

    [restaurant addCategories:myCategorySet]; 


    error = nil; 
    if (![restaurant.managedObjectContext save:&error]) { 
     // Handle error 
     NSLog(@"restaurant - Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    }  
} 

Y que lo hace!

Muchas gracias por la ayuda que ustedes dos !!!

-Kurt

0

¿Cómo hago para configurar mis Restaurantes Categoría con los diferentes valores? y luego ¿cómo puedo recuperarlos?

Lo mejor que puede hacer es ir a través de la Core Data Tutorial for iPhone, que pasa a través de la forma de añadir nuevas instancias de objetos gestionados de un tipo de entidad (en su caso, "restaurante"), establecer los atributos de esa instancia (por ejemplo, "restaurante. categoría ") y obtener resultados.

El tutorial usa un tipo de entidad llamado "Evento" que tiene atributos de fecha y ubicación, pero las ideas son todas iguales.

4

Usted quiere hacer algo como esto, en su lugar:

Restaurant *mcDonalds = (Restaurant *)[NSEntityDescription insertNewObjectForEntityForName:@"Restaurant" inManagedObjectContext:managedObjectContext]; 
mcDonalds.name = @"McDonalds"; 

Restaurant *inNOut = (Restaurant *)[NSEntityDescription insertNewObjectForEntityForName:@"Restaurant" inManagedObjectContext:managedObjectContext]; 
inNOut.name = @"In-N-Out"; 

Category *driveThru = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext]; 
driveThru.name = @"Drive Thru to Go"; 

Category *sitDown = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext]; 
sitDown.name = @"Sit Down and Eat"; 

// make NSSet* of Category objects 
NSSet *fastFood = [NSSet setWithObjects:driveThru, sitDown, nil]; 

// set Restaurant instances' categories ("to-many") property 
mcDonalds.categories = fastFood; 
inNOut.categories = fastFood; 

// save changes to managedObjectContext... 
NSError *error = nil; 
if ([managedObjectContext save:&error]) { 
    // handle save error 
} 

No estás instancias de su Category objeto administrado correctamente, y que desea aprender a utilizar los descriptores de acceso. Una vez que hayas hecho eso, podrás aprender cómo hacer recuperaciones.

Honestamente, recomendaría poner su proyecto a un lado y pasar por el Core Data Tutorial for iPhone.

4

Si desea llamar a un método como "-addCatagoryObject:" en su subclase NSManagedObject, debe tener el código para ese método en su archivo .m real - NO se genera en el tiempo de ejecución.

SIN EMBARGO, se puede generar para usted de forma semiautomática por Xcode - busque los diversos elementos de menú que le permiten copiar definiciones de métodos e implementaciones en Xcode.

La mayoría de las personas omiten esto hoy en día, usted NO NECESITA llamar a -addCategoryObject :, puede dejar que el tiempo de ejecución genere código de acceso para usted.

En primer lugar, su nombre de variable (en el encabezado y en su modelo) debe ser "categorías", no "categoría", ya que representa un conjunto, no un singleton.

A continuación, puede establecer categorías para cualquier conjunto que desee, usando algo como:

restaurant.categories = [NSSet setWithObjects:category1, category2, nil]; 
+0

Gracias Va por la respuesta .. Creo que mi problema podría ser otra cosa en algún lugar de mi código .. porque esto todavía no está funcionando, estoy buscando en mi db SQLLite y no puedo conseguir cualquier datos para mostrar o asociarme con mi restaurante en la tabla de unión. Publicaré una vez que lo descubra. Muchas gracias! – Kurt

Cuestiones relacionadas