我使用RestKit從本地緩存來自遠程服務器的數據。在它之間我有一個多對多的關係類別< < - >>新聞。該映射似乎正常工作,儘管它也保存我的類別表中的空值(它也保存了正確的類別)。像下面的圖片:RestKit多對多關係在連接表和空值主表中保存新行
看來,以節省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,[...]}
你可以使用下面一行並告訴我它返回的是什麼數字:NSNumber * count = [Category numberOfEntities] ;.如果這返回30,那麼一切都很好。忘記關係(連接)表,核心數據應正確管理,如果你的映射是正確的。 NSNumber * news = [新聞numberOfEntities]也應該是15. –
新聞返回15,似乎工作。但類別第一(在乾淨的數據庫)返回36(應該有6個類別從JSON),第二次我運行它是66等。而值爲NULL。 – Anders