7

私はこれについて理解できないので、何かあなたの助けが必要です. iOS で CoreData と一緒にMantleを使用しています。

次のように定義された関係があります。

投稿 1:N コメント

REST サービスからデータを取得するときに、コメントの NSMutableArray を含む Mantle オブジェクト ポストを作成します。これは問題なく動作します。

次に、これを Core Data に保存しますが、これは、自分が正しいことを行っているかどうかわからない場所です。

[MTLManagedObjectAdapter managedObjectFromModel:post insertingIntoContext:[self getManagedObjectContext] error:&error];

したがって、投稿オブジェクトを Core Data に保存するためにこれを行っています。Core Data Model には、「post_has_comments」と呼ばれるカスケード 1 対多の関係があります。したがって、オブジェクト Post には「posts_has_comments」があります -> カスケード、オブジェクト「Comment」には「Nullify」と 1 対 1 の関係があります。

私の知る限り、Core Data はこれを NSSet として扱います。私が入れようとしているのは NSMutableArray ですが、これは Mantle が処理してくれるためです (少なくとも、そのソースをざっと見てみるとわかりました)。

残念ながら、Core Data からオブジェクトを取得すると、

Post* post = [MTLManagedObjectAdapter modelOfClass:Post.class fromManagedObject:[[self fetchedResultsController] objectAtIndexPath:indexPath] error:nil];

投稿オブジェクトのプロパティ コメントは空の NSSet であり、事前に挿入するとかなりのエラーが発生します。私が得るエラー:

Core Data: annotation: repairing missing delete propagation for to-many relationship post_has_comments on object [...]

私は立ち往生しています - 多分私はここで何か大きなものを見逃していますか?

私の投稿クラスは、次の静的メソッドを実装しています。

+ (NSDictionary *)managedObjectKeysByPropertyKey {
return @{
         @"post_id" : @"id",
         @"comments" : @"post_has_comments"
         };
}

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
             @"post_id" : @"id",
             };
}

+ (NSDictionary *)relationshipModelClassesByPropertyKey {
    return @{
             @"comments" : IHComment.class
             };
}
4

2 に答える 2

0

簡単な回避策は、独自のプロパティ セッター メソッドを記述し、値が設定されている場合はNSSet、それをNSMutableArrayに変換してからプロパティに戻すことivarです。

例えば:

- (void)setComments:(NSMutableArray *)comments {
    if ([comments isKindOfClass:NSSet.class]) {
        _comments = [NSMutableArray arrayWithArray:[((NSSet *)comments) allObjects]];
    } else {
        _comments = comments;
    }
}

私はそれを自分でかなりの回数やったことがありますが、それは魅力のように機能します!

于 2014-05-13T20:33:04.997 に答える
-5

マントルのドキュメントから:

Mantle を使用すると、Cocoa または Cocoa Touch アプリケーション用の単純なモデル レイヤーを簡単に作成できます。

これは単に証明されていない声明です。フレームワークを見ても、証拠がどこにあるかわかりません。オブジェクトを取得し、Apple の API を使用して Core Data に挿入する必要があります。

Post *cdPost = [NSEntityDescription insertNewObjectForEntityForName:@"Post"
   inManagedObjectContext:self.managedObjectContext];
// configure the cdPost object with the data from the web service
for (id commentObject in commentArrayFromPostObject) {
   Comment *cdComment = 
       [NSEntityDescription insertNewObjectForEntityForName:@"Comment"
       inManagedObjectContext:self.managedObjectContext];
   // configure the cdComment object with the data from the web service
   cdComment.post = cdPost;
}

それだけです。

于 2014-01-10T19:41:12.653 に答える