Hi,
Everyone this is a tutorial about, creating core data and their relationship, Before you read this you may need some knowledge about creating and using interface Builder,
so lets begin to create a simple core data application and providing them with a relation,
to start with create an empty project in the new project window not a single view based application.
then tick use core data in your application and then click on next and choose a place where you have to create the text.
Now you can notice that core data has already inserted some different set of methods in your app delegate, this is because you have chosen to use core data in your applications.
Now before going further you have to understand three objects:
1.Managed Object context:
The context is responsible for mediating between its managed objects and the rest of the Core Data infrastructure. The infrastructure is in turn responsible for, for example, translating changes to managed objects into undo actions maintained by the context, and also into operations that need to be performed on the persistent store with which the managed object is assigned. it is expected that you either keep a reference to the context, or you have a means of easily retrieving it
2.Managed Object model:
An NSManagedObjectModel
object describes a schema—a collection of entities (data models) that you use in your application.A managed object model maintains a mapping between each of its entity objects and a corresponding managed object class for use with the persistent storage mechanisms in the Core Data Framework. You typically create managed object models using the data modeling tool in Xcode, but it is possible to build a model programmatically if needed.
3.Persistent store Coordinator:
Instances of NSPersistentStoreCoordinator
associate persistent stores (by type) with a model (or more accurately, a configuration of a model) and serve to mediate between the persistent store or stores and the managed object context or contexts.Instances of NSManagedObjectContext
use a coordinator to save object graphs to persistent storage and to retrieve model information. A context without a coordinator is not fully functional as it cannot access a model except through a coordinator. The coordinator is designed to present a façade to the managed object contexts such that a group of persistent stores appears as an aggregate store
So, thats the theory part of it read it to understand and then now let us define two classes
Student having the fields-> name, enrollno and sex.
College having fields -> name and skills.
So go to the data model and click add new entity at the bottom of the screen there create two entity
student and college having the fields in the following manner.
Now as you can see we have create two entities student and college, note that we have provided the relationship in it as studyrelation for student and the destination as college and link it with the other relationship in the inverse selection type. In the next college entity create a studentdetails relationship and we are going to create a to-many relationship because a college can have many student details and then select the destination as student and inverse as study relation.
The to-many relation ship is set in the following manner
Select the to-many relationship, choosing this creates a NSSet in your managed object class college.
Then do the following steps to create the ManagedObjectclass
select the NSManagedObject subclass and select the data model that you are going to use
the choose the entities that you are suppose to use and select next which create the two classes that u want.
To consume this, create a new view controller , create a new view controller and add two methods, add record and show record and set the windows root view controller to this view controller.
Lets examine the view controller xib and it consists of the following two methods
so create a member variable in view controller as NSManagedObjectContext *context; and its properties and its corresponding synthesis
@property (nonatomic,retain) NSManagedObjectContext *context;
@synthesize context;
Now in the viewdidload method of that view controller do this following inorder to access the context, only through a context can we access everything.
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[[UIApplication sharedApplication] delegate] managedObjectContext];
}
so with this step now we have obtained the context,
Now to add a record use the following method.
NSEntityDescription is used to insert the entity in the particular context
-(IBAction) addrecord
{
Student *stud; //object for student
College *col; // object for college
NSError *error;
stud = [NSEntityDescription
insertNewObjectForEntityForName:@"Student"
inManagedObjectContext:context];
// used to insert a record in to student entity
stud.name = @"Messi";
stud.enrollno = [NSNumber numberWithInt:123];
stud.sex = @"Male";
col = [NSEntityDescription insertNewObjectForEntityForName:@"College" inManagedObjectContext:context];
col.name = @"Kamaraj";
col.skills = @"IOS";
[col addStudentdetailsObject:stud];
//This line links the col by adding an entry to the NSSet of list for the studentdetails relation
[stud setStudyrelation:col];
//This line link the student with the college using study relation
if (![context save:&error]) { //save changes
NSLog(@"couldn't save: %@", [error localizedDescription]);
} else {
NSLog(@"inserted successfully");
}
}
Inorder to retreive the record we have another method to list the records
The NSFetchRequest is used to fetch a particular record from the given context of records and then it returns all those result for the particular entity in an array
-(IBAction) listrecord
{
NSFetchRequest *fRequest;
NSEntityDescription *eDesc;
NSArray *arr;
eDesc = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];
fRequest = [[NSFetchRequest alloc] init];
[fRequest setEntity:eDesc];
arr = [context executeFetchRequest:fRequest error:nil];
NSLog(@"Student");
for (Student *st in arr) {
NSLog(@"%@", st.name);
NSLog(@"%@",st.enrollno);
NSLog(@"%@",st.sex);
NSLog(@"%@",st.studyrelation.name);
// by means of linking from student one can access all the college relations values, so using my relation name i can access the relation names of the other class.
NSLog(@"%@",st.studyrelation.skills);
}
eDesc = [NSEntityDescription entityForName:@"College" inManagedObjectContext:context];
[fRequest setEntity:eDesc];
arr = [context executeFetchRequest:fRequest error:nil];
NSLog(@"college");
for (College *cl in arr)
{
NSLog(@"%@",cl.name);
NSLog(@"%@",cl.skills);
}
}
So once can access the college record, from the student record through the use of giving relationship among the classes st.studyrelation.name, where name is the object of college.
This will add the same hardcoded student name in the core data, you can customize them as per your wish using this.
You can download the copy of the above tutorial using this link