Need help with many-to-many relationships in core data for iPhone

邮差的信 提交于 2019-12-03 07:40:39
Kurt

OK, After working on this for the past 2 days I finally came up with my solution which was actually a mix between Alex and Wills suggestions... Thank you to both of you!!

Here is what I have...

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

and then I save like this

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

And that does it!

Thank you so much for the help you two!!!

-Kurt

You would want to do something like this, instead:

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
}

You're not instantiating your Category managed object correctly, and you want to learn how to use the accessors. Once you have done that, you will be better able to learn how to do fetches.

Honestly, I would recommend putting your project to the side and going through the Core Data Tutorial for iPhone.

If you want to call a method like "-addCatagoryObject:" on your NSManagedObject subclass, you have to have the code for that method in your actual .m file - it is NOT generated at runtime.

HOWEVER, it can be generated for you semi-automatically by Xcode - look for the various menu items that allow you to copy method definitions and implementations in Xcode.

Most people skip these nowadays, you don't NEED to call -addCategoryObject:, you can just let the runtime generate accessor code for you.

First off, your variable name (in the header and in your model) should be "categories", not "category", since it's representing a set, not a singleton.

You can then set categories to any set you want, using something like:

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

How do I go about setting my Restaurants Catagory with the different values? and then how do I fetch them back?

The best thing to do is go through the Core Data Tutorial for iPhone, which goes through how to add new managed object instances of an Entity type (in your case, "Restaurant"), set that instance's attributes (e.g., "Restaurant.category") and fetch results.

The tutorial uses an Entity type called "Event" which has date and location attributes, but the ideas are all the same.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!