RestKit多对多关系在主表中的连接表和空值保存新行

我使用RestKit从本地caching来自远程服务器的数据。 在其中,我有类别<< – >>新闻之间的多对多关系。 映射似乎工作正常,尽pipe它也保存我的类别表中的空值(它也保存了正确的类别)。 如下图所示:

在这里输入图像说明

它似乎保存30空行,我也有30(非空)行在我的连接表,所以这里可能有一个相关性。

我得到的JSON如下所示: "categories":[{"category_id":1},{"category_id":4}]

我有两个从NSManagedObjectinheritance的自定义模型对象。

 @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获取请求我的类别{“类别”:{[…],“ID”:1,[… …]}

这一行是错误的:

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

它应该是

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

编辑:你有对象映射将映射两个JSON格式。

1){“categories”:[{“id”:7},{“id”:12}]}当你有资源path@“[path-to-JSON]”

2){“news”:[{“id”:5,“categories”:[{“id”:7}]}]}当你有资源path@“[path-to-JSON]”

(我认为那些实际path是不同的方式)

其他任何东西,比如你在问题顶部发布的JSON,都是行不通的。 您所看到的问题是因为在您的JSON中找不到主键属性,所以当对象保存到核心数据时,会创build一个没有主键的新实体。