2013-10-01 273 views
1

我有以下文件:核心數據關係

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

裏面ProductViewController.m我有我的按鈕,我通過使用核心數據的產品的信息保存到我的的SQLite數據庫。 Inside ComponentsViewController.m我有我的按鈕來保存組件的信息到我的sqlite。 我有一個一對多(產品到組件)關係在我的數據模型中創建。我的問題是當我保存我的組件信息而不是將組件分配給我已經創建的產品時,信息被保存到當我按下保存組件按鈕時創建的「空」產品。我下面的代碼:

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]; 

} 
+0

你爲什麼要創建一個新的產品,那麼在'addComponents:'如果你想添加到現有的產品? –

回答

1

不要在創建組件時創建新產品。創建組件時,只需使用相對ID獲取產品並將產品參考存儲在組件中。

這裏是我的示例代碼:

我創建了一個相同類型的一對多關係(項目 - > Item_Details)

步驟1:首先我做插入項目實體。

第2步:插入item_Details時,我只是使用相對ID從Item實體中獲取item.info。

一旦你創建了NSManagedObjectSubClass(帶關係),它會自動創建參考實例,就像你提到的那樣。

#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 

//的讀取與關係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"); 


} 
0

ComponentsViewController.m,你在這條線在這裏創建一個空的產品:

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

如果你想與新創建Components對象與先前創建Product對象的關係,您必須使用FetchRequest從核心數據獲取產品,或將ProductProductViewController傳遞到ComponentsViewController

+0

如何將產品從productviewcontroller傳遞到componentsviewcontroller?這就是我想要做的,但我只是不知道如何。 – Fxbaez

+0

你如何分配/啓動ComponentsViewController對象? ProductViewController和ComponentsViewController之間有任何關係嗎? –

+0

我在我的AppDelegate上創建了一個獲取請求,我用它來填充產品的所有名稱的表格視圖,一旦我點擊任何產品,我就可以進入componentsviewcontroller的視圖來鍵入組件信息。 – Fxbaez