2009-09-19 4 views
6

W bieżącym projekcie doszedłem do blokady. Mam zasadniczo app, który jest bardzo podobny do aplikacji przepisu danych Core ... Oto podstawowa struktura mam w .xcdatamodelPotrzebujesz pomocy w relacjach wiele do wielu w podstawowych danych dla iPhone'a

jednostki: Restauracja String: imię Kategoria: kategoria < ---- do -Wiele związek

jednostki: Kategoria String: imię restauracji: restauracja < ---- do wielu relacja Więc zasadniczo, Restauracja może mieć wiele kategorii ... i istnieje szereg const predefiniowanych kategorii .. Na przykład: Restaura nt: Imię i nazwisko: Chili's Kategorie: Na wynos, rodzinne posiłki

"Na wynos" i "Rodzinna restauracja" to 2 z 10 różnych możliwych kategorii restauracji. Jak mam to zrobić ... Sprawdziłem bazę danych sqllite i mam tabelę ZRestaurant i ZCategory + tabelę łączenia dla obu ... Mam dane w obu ...

Jak to zrobić? Czy podoba mi się ustawienie mojej restauracji z różnymi wartościami? a potem jak je odzyskać?

Dzięki! Kurt

Odpowiedz

5

OK, Po pracy na ten temat w ciągu ostatnich 2 dni w końcu wymyślił mój roztwór, który rzeczywiście mieszanka Alex i Wills sugestie ... Dziękuję wam obu !!

Oto co mam ...

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]]; 

a następnie zapisać się ten

- (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 
    }  
} 

I to prawda!

Dziękuję bardzo za pomoc dwójki !!!

Kurt

0

W jaki sposób mogę ustawić moje restauracje z różnymi wartościami? a potem jak je odzyskać?

Najlepiej zrobić to poprzez Core Data Tutorial for iPhone, który zawiera informacje dotyczące dodawania nowych instancji zarządzanych obiektów typu Entity (w twoim przypadku "Restauracja"), ustaw atrybuty tej instancji (np. "Restauracja. kategoria ") i pobrać wyniki.

Samouczek używa typu jednostki o nazwie "Wydarzenie", który ma atrybuty daty i lokalizacji, ale pomysły są takie same.

4

co chcesz zrobić coś takiego, zamiast:

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 
} 

Nie jesteś instancji swój Category zarządzanego obiektu prawidłowo, a chcesz dowiedzieć się, jak korzystać z akcesorów. Gdy to zrobisz, będziesz mógł lepiej nauczyć się pobierać.

Szczerze mówiąc, polecam odłożyć Twój projekt na bok i przejść przez Core Data Tutorial for iPhone.

4

Jeśli chcesz wywołać metodę typu "-addCatagoryObject:" w podklasie NSManagedObject, musisz mieć kod dla tej metody w aktualnym pliku .m - NIE jest generowany w czasie wykonywania.

JEDNAKŻE można go wygenerować dla ciebie półautomatycznie przez Xcode - poszukaj różnych pozycji menu, które pozwolą Ci skopiować definicje metod i implementacje w Xcode.

Większość ludzi omija je teraz, nie musisz dzwonić -addCategoryObject :, możesz po prostu pozwolić środowisku wykonawczemu wygenerować kod dostępu dla ciebie.

Po pierwsze, nazwa zmiennej (w nagłówku i modelu) powinna być "kategoriami", a nie "kategorią", ponieważ reprezentuje zbiór, a nie singleton.

Następnie można ustawić kategorię do dowolnego zestawu chcesz, używając coś jak:

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

Dziękuję Czy na odpowiedź .. Myślę, że mój problem może być coś gdzieś indziej w moim kodu .. bo to nadal nie działa, szukam w moim SQLLite db i nie mogę nic dane do wyświetlenia lub skojarzenia z moją restauracją w tabeli łączenia. Odpowiem po tym, jak to wymyślę. Dziękuję bardzo! – Kurt

Powiązane problemy