Fxbaez
Fxbaez

Reputation: 193

Core Data Relationship

I have the following files:

ProductViewController.h
ProductViewController.m
ComponentsViewController.h
ComponentsViewController.m

Inside ProductViewController.m I have my button where I save the product's info to my sqlite database by using core data. Inside ComponentsViewController.m I have my button to save the Components' info to my sqlite. I have a one-to-many (product-to-components) relationship created in my datamodel. My problem is when I save my components info instead of assigning the components to my already created product the info gets saved to an "empty" product that gets created when I press the save components button. below my code:

ProductViewController.m

- (IBAction)saveProductButton:(id)sender {




    // Add product info to Data base

Product *newProduct = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:self.managedObjectContext];

    newProduct.prdname = self.name.text;
newProduct.prdtdesc = self.prdtdesc.text;
newProduct.prdtid = self.prdtid.text;

    NSError *error;
    if (![self.managedObjectContext save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }
    //  4
    self.name.text = @"";
    self.prdtid.text = @"";
    self.prdtdesc.text = @"";

    //  5
    [self.view endEditing:YES];
}


ComponentsViewController.m

- (IBAction)addComponent:(id)sender {



Product *newProduct = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:self.managedObjectContext];

 Components * newComponent = [NSEntityDescription insertNewObjectForEntityForName:@"Components"
 inManagedObjectContext:self.managedObjectContext];
 newComponent.prdtcompname = self.prdtcompname.text;
newComponent.prdtcompid = self.prdtcompid.text;
newComponent.prdtcompdesc = self.prdtcompdesc.text;
newComponent.prdtcompqt = self.prdtcompQT.text;

newProduct.tocomponents = [NSSet setWithObjects:newComponent, nil];


 NSError *error;
 if (![self.managedObjectContext save:&error]) {
 NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
 }
 //  4

 self.prdtcompQT.text = @"";
 self.prdtcompname.text = @"";
 self.prdtcompid.text = @"";
 self.prdtcompdesc.text = @"";
 //  5
 [self.view endEditing:YES];

}

Upvotes: 1

Views: 144

Answers (2)

Ganapathy
Ganapathy

Reputation: 4614

Dont Create a new product while creating a component. While creating a component, just fetch a product with the relative ID and store the product reference in component.

Here is my sample code:

I have created a same kind of one to many relationship (Item -> Item_Details)

Step 1: First i do insertion in item entity.

Step 2 : while Insertion of item_Details i just fetch item.info from the Item entity using the relative Id.

Once you create a NSManagedObjectSubClass (with relationship) it will automatically create the reference instance as u mentioned.

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Item;

@interface Item_Detail : NSManagedObject


@property (nonatomic, retain) NSNumber * item_Id;      // Item_Id is a common id in both item and Item_details should act as a relation.
@property (nonatomic, retain) NSString * item_Size;
@property (nonatomic, retain) NSString * last_Modified;
@property (nonatomic, retain) NSNumber * price;

@property (nonatomic, retain) Item *itemInfo;  // RelationShip reference

@end

// Fetching the Item info with relationship ID:

 +(Item *)getSourceItemDetail:(NSNumber *)itemId
    {
        NSEntityDescription *itemEntity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:[ASDataManager managedObjectContext]];
        NSFetchRequest *itemFetchRqt= [[NSFetchRequest alloc]init];
        [itemFetchRqt setEntity:itemEntity];

        NSPredicate *itempredicate = [NSPredicate predicateWithFormat:@"item_Id = %@",itemId];
        [itemFetchRqt setPredicate:itempredicate];
        NSError *error = nil;
        NSArray *resultArray = [[ASDataManager managedObjectContext] executeFetchRequest:itemFetchRqt error:&error];

        if([resultArray count] == 1)
        {
            Item *item = (Item *)[resultArray objectAtIndex:0];
            return item;
        }
        return nil;
    }


//Item_Detail _Insertion
+(void)insertNewItemDetailRecordInItemDetailTable:(NSDictionary *)itemDetailDic
{

    Item_Detail *item_Dtls = (Item_Detail *)[NSEntityDescription insertNewObjectForEntityForName:@"Item_Detail" inManagedObjectContext:[ASDataManager managedObjectContext]];


    item_Dtls.item_Id = [NSNumber numberWithInt:[[itemDetailDic valueForKey:@"Item_ID"] intValue]];
    item_Dtls.item_Size = [ASGlobalInfoHelper getValueIfNotNullFrom:[itemDetailDic objectForKey:@"Item_Size"] valueType:ValueTypeString];

    item_Dtls.itemInfo = [self getSourceItemDetail:[NSNumber numberWithInt:@"90"]];
    //Getting Relationship data
    if(![[ASDataManager managedObjectContext] save:nil])
        NSLog(@"Error in Save");


}

Upvotes: 1

Puneet Sharma
Puneet Sharma

Reputation: 9484

In ComponentsViewController.m, you are creating an empty product here in this line:

Product *newProduct = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:self.managedObjectContext];

If you want to have a relationship with newly created Components object with the previously created Product object, you either have to fetch the Product from Core Data using FetchRequest or pass the Product from ProductViewController to ComponentsViewController.

Upvotes: 0

Related Questions