0

RestKit を使用して、リモート サーバーからのデータをローカルにキャッシュします。その中で、カテゴリ <<-->> ニュースの間に多対多の関係があります。カテゴリ テーブルに null 値も保存されますが、マッピングは適切に機能しているようです (正しいカテゴリも保存されます)。下の画像のように:

ここに画像の説明を入力

30 個の null 行を保存しているようです。また、結合テーブルに 30 個の (null ではない) 行があるため、ここに相関関係がある可能性があります。

取得した JSON は次のようになります。"categories":[{"category_id":1},{"category_id":4}]

から継承する 2 つのカスタム モデル オブジェクトがあります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、null 行)。

更新 2:カテゴリ {"categories":{[...], "id":1, [...]} の JSON get リクエスト

4

1 に答える 1

0

この行は間違っています:

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

そのはず

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

編集: あなたが持っているオブジェクト マッピングは、2 つの JSON 形式をマップします。

1) {"categories":[{"id":7},{"id":12}]} リソース パス @"[path-to-JSON]" がある場合

2) {"news":[{"id":5, "categories":[{"id":7}]}]} リソース パス @"[path-to-JSON]" がある場合

(ちなみに、これらの実際のパスは異なると思います)

質問の上部に投稿した JSON など、他のものは機能しません。表示されている問題は、主キー属性が JSON に見つからないためです。そのため、オブジェクトがコア データに保存されると、主キーのない新しいエンティティが作成されます。

于 2012-06-27T14:58:32.583 に答える