0

ADN からデータベースへの投稿のマッピングに問題があります。

私は MagicalRecord を使用して、JSON をセットアップした NSManagedObjects に自動的にマップしていることに注意してください。

JSON はhttp://web.archive.org/web/20170123035402/https://developers.app.net/reference/resources/post/、具体的にはエンティティのセクションで確認できます。

私の Core Data モデルは、次の関係でセットアップされています。

Post <-> Entities <->> Links/Hashtags/Mentions

リレーションシップは適切な名前でセットアップされているため、MagicalRecord はツリーを適切にマッピングできるはずです。Post オブジェクトには多数の属性があります。Entities オブジェクトとの関係は「entities」と呼ばれ、主キーが原因で失敗しているように見えます (MagicalRecord のコードが壊れている場所から知る限り)。

Entity は基本的に、各エンティティ タイプとの関係を保持するための単なるオブジェクトであるため、Entity オブジェクトの属性はありません。残念ながら、Entity オブジェクトにランダムな名前の属性を設定することは役に立たないようです。

上記の情報に基づいて、関係とオブジェクトを適切にマッピングするために何か別の方法がありますか? 各エンティティ タイプへのリレーションシップに使用するこの空の Entities オブジェクトを使用しても問題ありませんか。これは、「エンティティ」ディクショナリを使用して ADN 投稿をセットアップする方法のようなものです。

4

2 に答える 2

0

まず、あなたは自分の「問題」を説明することを怠り、シナリオだけを説明しました。期待どおりに動作していないものは何ですか?

Core Dataエンティティに属性が存在するかどうかは、その動作に影響しません。

しかし、「エンティティ」という名前は、私のスパイダーマンの感覚を刺激します。NSManagedObjectには(パブリック)「entities」プロパティまたはメソッドはありませんが、「entity」メソッドはあります。

更新:次のモデルを使用して、新しいCoreDataテストプロジェクトを手動で作成しました。

アイテム<->エンティティ<->>Foo

そしてこのコード:

NSManagedObjectContext *moc = [self managedObjectContext];
NSManagedObject *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item"
                                                      inManagedObjectContext:moc];
NSManagedObject *ent = [NSEntityDescription insertNewObjectForEntityForName:@"Entities"
                                                     inManagedObjectContext:moc];
NSManagedObject *foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
                                                     inManagedObjectContext:moc];

[item setValue:ent forKey:@"entities"];
[foo setValue:ent forKey:@"entities"];

NSLog(@"%@ -> %@ -> %@", item, ent, foo);

そしてそれはうまくいきました。

更新:奇妙な振る舞いを引き起こすのに私が見つけることができる最も近いものはこれです:

[item setValue:@(YES) forKey:@"deleted"];
[item setValue:@(YES) forKey:@"is_deleted"];

NSLog(@"deleted=%@", [[item valueForKey:@"deleted"] boolValue] ? @"YES" : @"NO");
NSLog(@"is_deleted=%@", [[item valueForKey:@"is_deleted"] boolValue] ? @"YES" : @"NO");

ログには「deleted=NO」と「is_deleted=YES」が出力されますが、前者の場合は間違っています。既存の「isDeleted」メソッドは、「deleted」プロパティの「deleted」アクセサーの自動生成を防ぎます。

于 2012-12-15T15:32:14.260 に答える
0

したがって、問題は、NSManagedObjects と関係をセットアップした方法について、MagicalRecord と私自身に少しあります。

MagicalRecord は主キーを使用して関係を処理します。設定されていない場合は、いずれかの属性が使用されます。私の場合、EntitiesNSManagedObject には属性がありませんでした。これは、各エンティティ タイプとの関係を処理するために使用しているだけだからです。

このコードは次の場所にありますNSObject+MagicalDataImport.m

- (NSString *) MR_lookupKeyForRelationship:(NSRelationshipDescription *)relationshipInfo
{
    NSEntityDescription *destinationEntity = [relationshipInfo destinationEntity];
    if (destinationEntity == nil) 
    {
        MRLog(@"Unable to find entity for type '%@'", [self valueForKey:kMagicalRecordImportRelationshipTypeKey]);
        return nil;
    }

    NSString *primaryKeyName = [relationshipInfo MR_primaryKey];

    NSAttributeDescription *primaryKeyAttribute = [[destinationEntity attributesByName] valueForKey:primaryKeyName];
    NSString *lookupKey = [[primaryKeyAttribute userInfo] valueForKey:kMagicalRecordImportAttributeKeyMapKey] ?: [primaryKeyAttribute name];

    return lookupKey;
}

具体的には[[destinationEntity attributesByName] valueForKey:primaryKeyName];nil を返します。

最初は「test」という属性でテストしましたが、キャッシュをクリアするのに十分な仕事をしなかったのかもしれません。心配する必要がないように関係をもう一度クリアしようとしましたが、エンティティに属性「エンティティ」を追加したNSManagedObjectところ、すべてうまくいきました!

ごめん。MagicalRecord を使用していて、NSManagedObject に属性がない場合に誰かがこの問題に遭遇した場合に備えて、回答とコメントを追加するだけです。

于 2012-12-15T17:07:33.583 に答える