Нужна помощь в отношениях «многие ко многим» в основных данных для iPhone - PullRequest
6 голосов
/ 20 сентября 2009

Я достиг контрольно-пропускного пункта в моем текущем проекте. У меня есть приложение, которое очень похоже на приложение Core Data Recipe ... Вот основная структура, которая у меня есть в моем .xcdatamodel

Организация: Ресторан Строка: имя Категория: категория <---- ко многим </p>

Сущность: категория Строка: имя Ресторан: ресторан <---- ко многим отношениям Так что в основном ресторан может иметь несколько категорий ... И есть постоянное количество предопределенных категорий .. Например: Ресторан: Название: Чили Категории: Еда на вынос, Семейный ужин </p>

«Еда на вынос» и «Семейный обед» - это 2 из 10 возможных категорий ресторанов Как мне это сделать .. Я посмотрел базу данных sqllite, и у меня есть таблицы ZRestaurant и ZCategory + таблица соединений для них обоих ... У меня есть данные в обоих ...

Как мне настроить мои Рестораны Catagory с разными значениями? и как мне вернуть их обратно?

Спасибо всем! Курт

Ответы [ 4 ]

5 голосов
/ 22 сентября 2009

ОК, проработав это в течение последних 2 дней, я наконец-то придумал свое решение, которое на самом деле представляло собой смесь предложений Алекса и Уиллса ... Спасибо вам обоим !!

Вот что у меня есть ...

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

а потом я сохраняю вот так

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

И это делает!

Огромное спасибо за помощь вам двоим !!!

-Kurt

4 голосов
/ 20 сентября 2009

Вместо этого вы хотели бы сделать что-то вроде этого:

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
}

Вы неправильно создаете экземпляр управляемого объекта Category и хотите узнать, как использовать средства доступа. После того, как вы это сделаете, вы лучше научитесь делать выборки.

Честно говоря, я бы порекомендовал отложить ваш проект в сторону и пройти Руководство по основным данным для iPhone .

4 голосов
/ 20 сентября 2009

Если вы хотите вызвать метод наподобие "-addCatagoryObject:" в своем подклассе NSManagedObject, вам необходимо иметь код для этого метода в вашем фактическом файле .m - он НЕ генерируется во время выполнения.

ОДНАКО, он может быть сгенерирован для вас полуавтоматически XCode - ищите различные пункты меню, которые позволяют вам копировать определения методов и реализации в XCode.

Большинство людей в наши дни пропускают это, вам НЕ НУЖНО вызывать -addCategoryObject:, вы можете просто позволить среде выполнения генерировать для вас код доступа.

Во-первых, имя вашей переменной (в заголовке и в вашей модели) должно быть "категориями", а не "категорией", поскольку оно представляет набор, а не одиночку.

Затем вы можете установить категории на любой набор, используя что-то вроде:

restaurant.categories = [NSSet setWithObjects:category1, category2, nil];
0 голосов
/ 20 сентября 2009

Как мне настроить мои рестораны по категориям с разными значениями? и как мне вернуть их обратно?

Лучше всего пройти через Core Data Tutorial для iPhone , в котором рассказывается, как добавлять новые экземпляры управляемых объектов типа Entity (в вашем случае, «Restaurant»), установить атрибуты экземпляра (например, «Restaurant.category») и выборка результатов.

В учебном пособии используется тип сущности под названием «Событие», который имеет атрибуты даты и местоположения, но идеи все те же.

...