jkd359
jkd359

Reputation: 161

iOS Core Data one-to-many Relationships

Okay so i understand fetch requests, and accessing one to one relationships from one another i can do. I am having a little trouble understanding one to many.

My example: A Suburb has many Streets and these Streets belong to one Suburb. This creates the NSSet property. How do i add a Street and its properties (i.e. @"name") to a particular suburb. I have a TableView listing the Suburbs and when you click on a Suburb it should show the streets associated with that particular Suburb.

I understand there are other Core Data to-many questions on here but reading them it is just not "clicking" over in my head for some reason.

I am using MagicalRecord but from my understanding all that does is minimise the code i have to write and so i need to understand how to do it in Core Data before i can even attempt it on MR.

Upvotes: 2

Views: 1356

Answers (2)

nmh
nmh

Reputation: 2503

  1. Create query to check whether Suburb is existed. If no, create new Suburb

  2. Get NSSet Streets from Suburb.

    If NSSet *Suburb == nil -> create Street, assign name to this Street -> create new Suburb and assign Street to this Suburb

    If NSSet *Suburb != nil -> insert new Street to Suburb

Hope this idea help you.

Upvotes: 0

Zia
Zia

Reputation: 14722

1: Create an instance of the suburb entity:

    AppDelegate* appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext* context = [appDelegate managedObjectContext];
    Suburb *mySuburb = [NSEntityDescription insertNewObjectForEntityForName:@"Suburb" inManagedObjectContext:context];

2: Initialize the set of streets in the suburb

mySuburb.streets = [[NSMutableSet alloc]init];

3: Create a street:

    Street *myStreet = [NSEntityDescription insertNewObjectForEntityForName:@"Street" inManagedObjectContext:context];

4: "Link" the two

myStreet.suburb = mySuburb;
[mySuburb addStreetObject:myStreet];

Edit: The above is assuming you created the right relationships. Ideally, the streets relationship attribute will be a cascade type relationship and the suburb relationship attribute will be nullify. If that is the case, when you delete a street, it will be gone from the set of streets that belong to a suburb. If you delete a suburb, it will delete all the streets along with it.

Oh and don't forget to save context.

Upvotes: 2

Related Questions