Search This Blog

Thursday 22 March 2012

Core Data Introduction


Hello readers in this post we will learn what is core data .

But before learning this we must be very clear with the basic concepts of core data and that is what we will be seeing first.

What is Core Data and what is it used for?

Well in a few words if I would like to describe core data that would be it is used to store data from your iPhone application into a sqlite file which is present in the document directory of your application, now if you ask me what is document directory I would say it is nothing but a directory inside the application folder which is created to store the application oriented data such as some files, images, sqlite database etc. With the release of version 3.0, Apple has made their Core Data system available on the iPhone OS.

Core Data has been available on the Macintosh platform for a number of years, and provides a high-level data abstraction framework that offers integrated design tools and runtime support to address complex data management needs unlike SQLite, the Core Data model is not strictly relational in nature.

Ok now coming to the million dollar question and that’s

if core data is used to store data for our application then why do we use SQlite,

for those of you who don’t know what is SQlite well you can see SQlite is a relational database used for mobiles. Core Data has some significant advantages. Apple provides development tools that allow a developer to quickly lay out their data requirements and relationships this can reduce development time and save on code.

Core Data is not a relational database , you can see Core data as a wrapper around Sqlite although core data is quite simpler as compared to Sqlite but it does not offer some of the functionality that Sqlite can offer and vice versa.

In Core Data each and every entity is referred to as objects, objects which have relationship with them.Let’s say there are two entities Parent and Child having relationship with them then in this case Parent and Child will be referred as objects and in Core data and you can easily manipulate them. If your application is particularly well suited to the Relational Model, there may be advantages to having direct SQL query access to the data storage layer.


Some of the basic classes that you must know in order to proceed with core data are given below:





ManagedObject: Managed objects are the objects that are created by your application code to store data. A managed object can be thought of as a row or a record in a relational database table. For each new record to be added, a new managed object must be created to store the data. Similarly, retrieved data will be returned in the form of managed objects, one for each record matching the defined retrieval criteria. Managed objects are actually instances of the NSManagedObject class, or a subclass thereof. These objects are contained and maintained by the managed object context.

Persistance store coordinator: The persistent store coordinator is responsible for coordinating access to multiple persistent object stores. As an iPhone developer you will never directly interact with the persistence store coordinator and, in fact, will very rarely need to develop an application that requires more than one persistent object store. When multiple stores are required, the coordinator presents these stores to the upper layers of the Core Data stack as a single store.

Managed Object Context: Core Data based applications never interact directly with the persistent store. Instead, the application code interacts with the managed objects contained in the managed object context layer of the Core Data stack. The context maintains the status of the objects in relation to the underlying data store and manages the relationships between managed objects defined by the managed object model. All interactions with the underlying database are held temporarily in within the context until the context is instructed to save the changes, at which point the changes are passed down through the Core Data stack and written to the persistent store.

In my next post i will show you core data tutorial .

i hope this post was helpful to you

NSNotificationCenter tutorial


Design Phase: In today’s post we will be seeing a simple demonstration for the notification that I have explained in my earlier post.


I will be using two UIViewController subclasses one with the label which will be the listener and the other will be the broadcaster with the slider control, and when the slider will slide then we will register one notification and then refer that notification with its name to display the data of the slider on the first view controller, here’s a view at the final output to see what we are going to do.






Step 1: Open Xcode create a windows based application add two files of UIViewController subclass one with the name ListenerViewController and other with the name BroadCasterViewController so now the new files that are added into your project are 
ListenerViewController.h ,ListenerViewController.m and
BroadCasterViewController.h , BroadCasterViewController.m





Step 2: Create the ListernerViewController and the BroadCasterViewController like the one given in the image above in the design phase. After that select the appdelegate.m file in your project and create the object of these two view controller classes and add them to the tabbarController here’s the code to do that


#import "Notification_DemoAppDelegate.h"
#import "BroadCasterViewController.h"
#import "ListenerViewController.h"

@implementation Notification_DemoAppDelegate
@synthesize window=_window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    // Override point for customization after application launch.
    BroadCasterViewController *broadCastObject = [[BroadCasterViewController alloc]init];
    ListenerViewController *listenerObject = [[ListenerViewController alloc]init];
    NSArray *objectArray = [[NSArray alloc]initWithObjects:listenerObject,broadCastObject, nil];
    UITabBarController *tabC = [[UITabBarController alloc]init];
    tabC.viewControllers = objectArray;
    [self.window addSubview:tabC.view];
    [self.window makeKeyAndVisible];
    return YES;
}

Step 3: Now it’s time to register our notification for the slider control (remember we are registering the notification here in the notification dispatch table with an appropriate name and with the help of this name we will refer the slider value and display the slider value onto the UILabel object in the ListenerViewController) Create a method in the BroadCasterViewController and assign this method to the sliders value changed event


BoradCasterViewController.h file code


#import <UIKit/UIKit.h>

@interface BroadCasterViewController : UIViewController {
   
     UISlider *_sliderView;
}
-(void)Register_Notification:(UISlider*)control;

@end



BoradCasterViewController.m file code

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        _sliderView = [[UISlider alloc]initWithFrame:CGRectMake(1820328423)];
        _sliderView.minimumValue = 1.0f;
        _sliderView.maximumValue = 100.0f;
        [_sliderView addTarget:self action:@selector(Register_Notification:)forControlEvents:UIControlEventValueChanged];
        self.title = @"Broad cast";
    }
    return self;
}


now inside the function write this code


-(void)Register_Notification:(UISlider*)control
{
    [[NSNotificationCenter defaultCenterpostNotificationName:@"MySlider_Notification" object:control];
}


Code Explanation: 

postNotificationName: object: function is used to give your notification a name and register it with the object posting the notification in this case it will be the slider control as we have passed the slider reference as a parameter for the object.

This is all you have to do inorder to register a notification.

Step 4: Now once we are done with registering the notification, we will code for the observer who is observing this notification i.e the listener of this notification. So select the ListenerViewController.h file and create a function (we will come to the explanation of this function later)

-(void)ReadSliderValue:(NSNotification*)notification;

Now after the declaration of this function its time to give body to this function inside the ListenerViewController.m file, here's the code to do that

-(void)ReadSliderValue:(NSNotification*)notification
{
    UISlider *slider = [notification object];
    _sliderValueLabel.text = [NSString stringWithFormat:@"%.f",slider.value];
                       
}


Code Explanation: The above method has a parameter which is the object of the NSNotification class and this class has an object method which itself is called as object which returns the object associated with a particular notification in this case UISlider.

The main moto of the demo is that when you will select the tab of the BroadCasterView and slide the slider then in that case a notification must be registered and when you again come to the ListenerView then you must see the sliders value in the label, so we have to read the data from the dispatch table for the slider and assign it to the label in such a way so that when the user selects the ListenerView then he must see the changed value of the slider through the dispatch table so for doing this you have to add in one small piece of code in the ListenerViewControllers init method which is given below.


[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(ReadSliderValue:)name:@"MySlider_Notification" object:nil];


Code Explanation: The addObserver method of the NSNotifficationCenter class is used to add an observer for the notification in the dispatch table with a selector, which performs an appropriate action when the said notification is triggered, here we will be reading the value of the slider control present in the BroadCastViewController in the ListenerViewController.

Step 5: Run the app and get the output like the one given in the below image









You can even add more than one notification at a time here's a view at the same demo that i have explained above and this time i am using the switch control as well to determine whether the switch is on or off via notification, here's a view at the output 







I hope that this post has helped you