How to use CoreData in Xcode 8?
Asked Answered
O

4

5

I am trying use CoreData, but when I add it to my project I only get two new methods :

- (NSPersistentContainer *)persistentContainer

and

- (void)saveContext

Now I can't get old methods to work with CoreData, and I can't find any tutorials with these new methods and Objective-C. How can I save and get data from CoreData using persistentContainer in Xcode 8 with Objective-c?

Odetteodeum answered 8/12, 2016 at 13:5 Comment(3)
Nikhil Manapure . Thanks, but I don't understand Swift well yet. But it's will be a great if you will show me how can do that in Swift and I will try to do that in Objective-COdetteodeum
@Nikhil Manapure Thanks a lot!!! I will waiting solution with Objective COdetteodeum
Please refer to the code from the following URL. github.com/dilipkosuri/CoreDataIOSCrossley
E
16

You can Get context as -

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

or as in Objective-C

NSManagedObjectContext *context = ((AppDelegate*)[[UIApplication sharedApplication] delegate]).persistentContainer.viewContext;

And fetch data like -

var resultArray  = try self.context.fetch(EntityName.fetchRequest())

or as in Objective-C

NSFetchRequest<EntityName *> *fetchRequest = [EntityName fetchRequest];
NSError *error ;
NSArray *resultArray= [context executeFetchRequest:fetchRequest error:&error];

And fetch data with sorting -

var resultArray = [EntityName]()
do {
        let request : NSFetchRequest<EntityName> = EntityName.fetchRequest()
        let sortDescriptor = NSSortDescriptor(key: "somekey", ascending: true)
        let sortDescriptors = [sortDescriptor]
        request.sortDescriptors = sortDescriptors
        resultArray = try self.context.fetch(request)
} catch {
        print("Error")
}

or as in Objective-C

NSFetchRequest<EntityName *> *fetchRequest = [EntityName fetchRequest];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"someKey" ascending:YES];
fetchRequest.sortDescriptors = @[sortDescriptor];
NSError *error ;
NSArray *resultArray= [context executeFetchRequest:fetchRequest error:&error];

And add data like -

let entityNameObj = EntityName(context: context)
entityNameObj.title = "title"

or as in Objective-C

NSManagedObject *entityNameObj = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:context];
[entityNameObj setValue:@"someValue" forKey:@"someKey"];

And save context like -

do {
     try self.context.save()
} catch _ as NSError {
     print("Error")
}

or as in Objective-C

[((AppDelegate*)[[UIApplication sharedApplication] delegate]) saveContext];
Erickson answered 8/12, 2016 at 13:15 Comment(0)
C
3
-(void)profileDatabase {
NSManagedObjectContext* context=[ADM.persistentContainer viewContext];

NSManagedObject *profile=[NSEntityDescription insertNewObjectForEntityForName:@"Profile" inManagedObjectContext:context];

[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"firstName"] forKey:@"firstName"];
[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"surName"] forKey:@"surName"];
[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"batchID"] forKey:@"batchID"];
[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"profileImagePath"] forKey:@"profileImagePath"];
[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"registeredEmail"] forKey:@"registeredEmail"];
[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"role"] forKey:@"role"];
[profile setValue:[self.serverResponseOfProfileDict objectForKey:@"studentID"] forKey:@"studentID"];

NSLog(@"userObj:%@",profile);
NSError* error;
[context save:&error];


NSFetchRequest *fetchRequest=[[NSFetchRequest alloc]initWithEntityName:@"Profile"];

fetchRequest.returnsObjectsAsFaults=NO;
NSArray* results=[context executeFetchRequest:fetchRequest error:&error];
NSLog(@"Result:%@",results);

    NSManagedObject *result=[results objectAtIndex:0];

    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"firstName"] forKey:@"firstName"];
    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"surName"] forKey:@"surName"];
    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"batchID"] forKey:@"batchID"];
    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"profileImagePath"] forKey:@"profileImagePath"];
    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"registeredEmail"] forKey:@"registeredEmail"];

    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"role"] forKey:@"role"];

    [ADM.databaseResponseOfProfileDict setObject:[result valueForKey:@"studentID"] forKey:@"studentID"];
    NSLog(@"dic:%@",ADM.databaseResponseOfProfileDict);}
Charismatic answered 4/5, 2017 at 5:44 Comment(0)
O
0

I have found a solution using Objective C. It runs, but I'm not sure that it is the correct solution.

- (void)dbManager {
NSManagedObjectContext *context = self.persistentContainer.viewContext;
NSError *error = nil;
if ([context hasChanges] && ![context save:&error]) {
    // Replace this implementation with code to handle the error appropriately.
    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
    NSLog(@"Unresolved error %@, %@", error, error.userInfo);
    abort();
}

    NSManagedObject *customAnimal = [NSEntityDescription insertNewObjectForEntityForName:@"Animals" inManagedObjectContext:context];
    [customAnimal setValue:@"Lion" forKey:@"type"];
    [customAnimal setValue:@"Rabit" forKey:@"name"];
    [customAnimal setValue:@"Blue" forKey:@"color"];
    [customAnimal setValue:@12 forKey:@"age"];



    NSLog(@"Get data from DB");

    NSMutableArray* animalsArray;


    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Animals"];


    animalsArray = [[context executeFetchRequest:fetchRequest error:nil] mutableCopy];



    NSLog(@"array is %@", animalsArray); // array is (
"<Animals: 0x6000000aee80> (entity: Animals; id: 0x60000022e120 <x-coredata:///Animals/tAAC7332D-6BEF-441C-9041-0ECB57469FA62> ; data: {\n    age = 12;\n    color = Blue;\n    name = Rabit;\n    type = Lion;\n})"    

}

Odetteodeum answered 8/12, 2016 at 14:42 Comment(0)
A
0

For all the beginners out there, this will give you the basic idea.

 welcome.m
    ==========
    #import "welcomepage.h"
    #import "Register.h"
    #import "login.h"
    #import "AppDelegate.h"
    #import "Student+CoreDataProperties.h"
    #import "loginbtn.h"
    #import "King+CoreDataProperties.h"

    @interface welcomepage ()
    {
        AppDelegate *a;
        NSManagedObjectContext *context;



    }

    @end

    @implementation welcomepage

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
    }
    - (IBAction)login:(id)sender
    {
        loginbtn *lb=[[loginbtn alloc]init];
        [self.navigationController pushViewController:lb animated:YES];


    }






    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    - (IBAction)register:(id)sender

    {

        a=(AppDelegate *)[UIApplication sharedApplication].delegate;


        NSManagedObjectContext *context1=((AppDelegate *)[UIApplication sharedApplication].delegate).persistentContainer.viewContext;



        Student *ss=[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context1];

        ss.name=[NSString stringWithFormat:@"%@",_txtfld1.text];

        ss.age=[NSString stringWithFormat:@"%@",_txtfld2.text];

        ss.place=[NSString stringWithFormat:@"%@",_txtfld3.text];

        [a saveContext];

        if (_txtfld1.text.length && _txtfld2.text.length && _txtfld3.text.length != 0)
        {
            UIAlertView *al=[[UIAlertView alloc]initWithTitle:@"THANK YOU" message:@"DATA SUCESSFULLY SAVER. YOU CAN LOGIN NOW WITH YOUR PASSWORD AND NAME" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [al show];

            _txtfld1.text=@"";
            _txtfld2.text=@"";
            _txtfld3.text=@"";

            Register *rg=[[Register alloc]init];

            [self.navigationController pushViewController:rg animated:YES];

        }
        else
        {
            UIAlertView *al2=[[UIAlertView alloc]initWithTitle:@"WARRNING" message:@"PLEASE FILL THE DATA COMPLETELY" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [al2 show];

        }

    }
    ===================================================
    Register.m
    ==========
    #import "Register.h"
    #import "AppDelegate.h"
    #import "Student+CoreDataProperties.h"
    #import "welcomepage.h"


    @interface Register ()<UITableViewDelegate,UITableViewDataSource>
    {
        AppDelegate *a;
        NSManagedObjectContext *context01;
        NSArray *array01;

    }

    @end

    @implementation Register

    - (void)viewDidLoad
    {
        [super viewDidLoad];


        a=((AppDelegate *)[UIApplication sharedApplication].delegate);
        context01=((AppDelegate *)[UIApplication sharedApplication].delegate).persistentContainer.viewContext;








        // specifying  nsrequest and nsentity

        NSFetchRequest *req=[[NSFetchRequest alloc]init];

        NSEntityDescription *entity01=[NSEntityDescription entityForName:@"Student" inManagedObjectContext:context01];

        [req setEntity:entity01];




        // putting datas from reto array




        NSError *err=nil;

        array01=[context01 executeFetchRequest:req error:&err];





    // Do any additional setup after loading the view from its nib.
    }



    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return array01.count;

    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {

        return 3;
    }
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *ci=@"hai";
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ci];

        if (cell==nil) {
            cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ci];
        }
        if (indexPath.row==0) {
            cell.textLabel.text=[[array01 objectAtIndex:indexPath.section]valueForKey:@"name"];
        }
        if (indexPath.row==1) {
            cell.textLabel.text=[[array01 objectAtIndex:indexPath.section]valueForKey:@"age"];
        }
        if (indexPath.row==2) {
            cell.textLabel.text=[[array01 objectAtIndex:indexPath.section]valueForKey:@"place"];
                }
            return cell;
    }

    ==================================================
    Loginbtn.m
    ============

    #import "loginbtn.h"
    #import "AppDelegate.h"
    #import "Student+CoreDataProperties.h"
    #import "login.h"

    @interface loginbtn ()
    {
        AppDelegate *a;
        NSArray *arraylb;



    }

    @end

    @implementation loginbtn

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
    }

    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    - (IBAction)lgbtn:(id)sender
    {
        a=(AppDelegate *)[UIApplication sharedApplication].delegate;


        //xcode 8.2.1 specification code

        NSManagedObjectContext *context=((AppDelegate *)[UIApplication sharedApplication].delegate).persistentContainer.viewContext;

        //creating feathch request and entity


        NSFetchRequest *req=[[NSFetchRequest alloc]init];
        NSEntityDescription *entity=[NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];

        [req setEntity:entity];
        // setting predicate


        NSPredicate *pre=[NSPredicate predicateWithFormat:@"age like %@ and place like %@",_txt1.text,_txt2.text];

        [req setPredicate:pre];


        //creating  error and array to store
        NSError *err=nil;

        arraylb=[[NSArray alloc]init];
        arraylb=[context executeFetchRequest:req error:&err];
        login *lg=[[login alloc]init];
        if (arraylb.count!=0)
        {

            lg.array001=arraylb;
        }




    //    
    //    if (arraylb.count!=0)
    ////    {
    ////        
    ////        lv *lvi=[[lv alloc]init];
    ////        
    ////        //passing value
    ////        lvi.array001=arraylb;
    ////        
    ////        
    ////        //lv.str1=self.tf1.text;
    ////        //lv.str2=self.tf2.text;
    ////        [self.navigationController pushViewController:lvi animated:YES];
    ////        
    ////        
    ////    }
    ////    else
    ////    {
    //        
    //        self.lb.text=@"Invalid username & password";
    //        
    //    }
    //    


        [self.navigationController pushViewController:lg animated:YES];




    }
    =====================================================
    Lohin.m
    =========

    #import "login.h"
    #import "Student+CoreDataProperties.h"
    #import "AppDelegate.h"
    #import "loginbtn.h"

    @interface login ()
    {
        AppDelegate *a;
        NSArray *array01;

    }

    @end

    @implementation login

    - (void)viewDidLoad
    {
        [super viewDidLoad];


        _txt11.text=[[_array001 objectAtIndex:0]valueForKey:@"name"];
        _txt22.text=[[_array001 objectAtIndex:0]valueForKey:@"age"];
        _txt33.text=[[_array001 objectAtIndex:0]valueForKey:@"place"];



        // Do any additional setup after loading the view from its nib.
    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.


        // Dispose of any resources that can be recreated.
    }
Alginate answered 24/6, 2018 at 2:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.