2012-06-27 30 views
0

我使用RestKit從本地緩存來自遠程服務器的數據。在它之間我有一個多對多的關係類別< < - >>新聞。該映射似乎正常工作,儘管它也保存我的類別表中的空值(它也保存了正確的類別)。像下面的圖片:RestKit多對多關係在連接表和空值主表中保存新行

enter image description here

看來,以節省30個空行,我也有我的連接表30(NOT NULL)行,以便有可能在這裏是有相關性。

,我得到看起來像這樣JSON:"categories":[{"category_id":1},{"category_id":4}]

我有一個從NSManagedObject繼承了兩個自定義模型對象。

@interface News : NSManagedObject 
    [...] 
    @property (nonatomic, retain) NSSet *categories; 
@end 

@interface Category : NSManagedObject 
[...] 
    @property (nonatomic, retain) NSSet *news; 
@end 

我在兩者上都使用@dynamic

我的映射是這樣的:

RKManagedObjectMapping *categoryMapping = [RKManagedObjectMapping mappingForClass:[Category class] inManagedObjectStore:objectManager.objectStore]; 

categoryMapping.primaryKeyAttribute = @"categoryId"; 
categoryMapping.rootKeyPath = @"categories"; 
[categoryMapping mapKeyPath:@"id" toAttribute:@"categoryId"]; 
[...] 

RKManagedObjectMapping* newsMapping = [RKManagedObjectMapping mappingForClass:[News class] inManagedObjectStore:objectManager.objectStore]; 

newsMapping.primaryKeyAttribute = @"newsId"; 
newsMapping.rootKeyPath = @"news"; 
[newsMapping mapKeyPath:@"id" toAttribute:@"newsId"]; 
[...] 

// Categories many-to-many (not fully working yet). 
[newsMapping mapKeyPath:@"categories" toRelationship:@"categories" withMapping: categoryMapping]; 

// Register the mappings with the provider 
[objectManager.mappingProvider setObjectMapping:newsMapping forResourcePathPattern:@"[path-to-JSON]"]; 
[objectManager.mappingProvider setObjectMapping:categoryMapping forResourcePathPattern:@"[path-to-JSON]"]; 

我取這樣的數據(很像Twitter的RestKit爲例):

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self loadCategories]; 
     [self loadCategoriesFromDataStore]; 

     [self loadNews]; 
     [self loadNewsFromDataStore]; 
    } 
    return self; 
} 

- (void)loadCategoriesFromDataStore 
{  
    NSFetchRequest* request = [Category fetchRequest]; 
    NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"categoryId" ascending:YES]; 
    [request setSortDescriptors:[NSArray arrayWithObject:descriptor]]; 
    _categories = [Category objectsWithFetchRequest:request]; 
} 

- (void)loadNewsFromDataStore 
{  
    NSFetchRequest* request = [News fetchRequest]; 
    NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO]; 
    [request setSortDescriptors:[NSArray arrayWithObject:descriptor]]; 
    _news = [News objectsWithFetchRequest:request]; 
} 

- (void)loadCategories 
{ 
    // Load the object model via RestKit 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
    [objectManager loadObjectsAtResourcePath:@"[link-to-JSON]" delegate:self]; 
} 

- (void)loadNews 
{ 
    // Load the object model via RestKit 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
    [objectManager loadObjectsAtResourcePath:@"[link-to-JSON]" delegate:self]; 
} 

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects { 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self loadCategoriesFromDataStore]; 
    [self loadNewsFromDataStore]; 
} 

任何想法我做錯了嗎?

說明: 當有15個新聞時,它似乎還保存了30行到連接表,我不知道這是否是連接表的正常行爲。

更新:它還映射連接表中錯誤的類別id(即類別66,一個空行)。

更新2: JSON我的類別get請求{ 「類別」:{[...], 「ID」:1,[...]}

+0

你可以使用下面一行並告訴我它返回的是什麼數字:NSNumber * count = [Category numberOfEntities] ;.如果這返回30,那麼一切都很好。忘記關係(連接)表,核心數據應正確管理,如果你的映射是正確的。 NSNumber * news = [新聞numberOfEntities]也應該是15. –

+0

新聞返回15,似乎工作。但類別第一(在乾淨的數據庫)返回36(應該有6個類別從JSON),第二次我運行它是66等。而值爲NULL。 – Anders

回答

0

此行是錯誤的:

[categoryMapping mapKeyPath:@"id" toAttribute:@"categoryId"]; 

應該

[categoryMapping mapKeyPath:@"category_id" toAttribute:@"categoryId"]; 

編輯: 你會映射表JSON格式的對象映射。

1){ 「類別」:[{ 「ID」:7},{ 「ID」:12}]}當你有資源路徑@ 「[路徑到JSON]」

2 ){「news」:[{「id」:5,「categories」:[{「id」:7}]}]}當您有資源路徑@「[path-to-JSON]」

(我假設那些實際路徑是不同的方式)

其他任何,如您在問題的頂部發布的JSON,將無法正常工作。你所看到的問題是因爲在你的JSON中找不到主鍵屬性,所以當對象被保存到核心數據時,會創建一個沒有主鍵的新實體。

+0

嗯,我不知道,id是來自我的JSON的PK,它映射到我的數據庫中的categoryId,然後categoryId也被用作RestKit的primaryKeyAttribute,可以防止重複。 – Anders

+0

沒有你的JSON是這個「類別」:[{「category_id」:1},{「category_id」:4}]。 category_id是要映射到核心數據PK categoryId的服務器PK的關鍵路徑。 –

+0

是的,但這是我的新聞JSON請求中的外鍵,在類別請求中PK看起來像這樣:'...「id」:1 ...',我將其映射到。 – Anders

相關問題