2012-04-30 44 views
2

我花了幾個小時嘗試插入/添加對象,但發生了重複的記錄。廣告系列記錄重新插入,即使它已經存在。我錯過了什麼嗎?RestKit手動保存對象

下面是我的代碼:

Campaign.h

@interface Campaign : NSManagedObject 

@property (nonatomic, strong) NSNumber* campaignId; 
@property (nonatomic, strong) NSString* title; 

@end 

Card.h

@class Campaign; 

@interface Card : NSManagedObject 

@property (nonatomic, strong) NSNumber* cardId; 
@property (nonatomic, strong) NSString* name; 
@property (nonatomic, strong) Campaign* campaign; 

@end 

ViewController.m

... 

Campaign* campaign = [Campaign object]; 
campaign.campaignId = [NSNumber numberWithInt:1]; 
campaign.title = @"Hello world"; 

Card* card = [Card object]; 
card.cardId = @"1234567890"; 
card.campaign = campaign; 

[[[RKObjectManager sharedManager] objectStore] save:nil]; 

EDITED ViewController.m

... 
RKManagedObjectMapping* cardMapping = [RKManagedObjectMapping mappingForClass:[Card class] inManagedObjectStore:[RKObjectManager sharedManager].objectStore]; 
[cardMapping mapKeyPath:@"id" toAttribute:@"cardId"]; 
[campaignMapping mapKeyPath:@"name" toAttribute:@"name"]; 
cardMapping.primaryKeyAttribute = @"cardId"; 

RKManagedObjectMapping* campaignMapping = [RKManagedObjectMapping mappingForClass:[Campaign class] inManagedObjectStore:[RKObjectManager sharedManager].objectStore]; 
[campaignMapping mapKeyPath:@"id" toAttribute:@"campaignId"]; 
[campaignMapping mapKeyPath:@"title" toAttribute:@"title"]; 
campaignMapping.primaryKeyAttribute = @"campaignId"; 

Campaign* campaign = [Campaign object]; 
campaign.campaignId = [NSNumber numberWithInt:1]; 
campaign.title = @"Hello world"; 

Card* card = [Card object]; 
card.cardId = @"1234567890"; 
card.campaign = campaign; 

[[[RKObjectManager sharedManager] objectStore] save:nil]; 

回答

1

是,添加.primaryKeyAttribute到您的映射。 當你通過休息套件導入數據時,這將爲你做pk的東西。如果你只是用Restkit做'普通'核心數據的東西,你需要自己處理引用的整合性等。

+0

我已經用.primaryKeyAttribute更新了我的代碼(請參閱上面的編輯),但是我仍然在活動實體中獲得重複的記錄。它適用於RKObjectManager的loadObjectsAtResourcePath,但不是當我嘗試手動添加對象時。 – Teon

+0

是的。如果你只是在做核心數據的東西,你將需要自己生成id(如果你想要的話)。你不需要它們,因爲設置card.campaign會存儲關係,而核心數據有它自己的內部id,除非你查看sqlite數據庫,否則你不會看到它。您可能需要的唯一原因是您要同步到遠程數據庫並且想與其同步,但是如果您按照我所說的那樣執行操作,則需要自己在代碼中執行該操作。 –

+0

另請參閱http://stackoverflow.com/questions/10264224/auto-index-for-a-coredata-in-objective-c –