7

我需要你的帮助,因为我无法理解这一点。我在 iOS 中将Mantle和 CoreData 一起使用。

我定义了如下所示的关系:

发表 1:N 评论

当我从我的 REST 服务中提取数据时,我创建了一个包含 NSMutableArray 评论的 Mantle Object Post。这完美无缺。

然后我将它存储在 Core Data 中,这就是我不知道我是否做对了的地方。

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

所以我这样做是为了将我的帖子对象存储到核心数据中。核心数据模型有一个名为“post_has_comments”的关系,它是一种级联的一对多关系。因此,在对象 Post 上,我有“posts_has_comments”-> 级联,在我的对象“Comment”上,我与“Nullify”有一对一的关系。

Afaik,Core Data 将其视为 NSSet。不过,我要输入的是一个 NSMutableArray,因为 Mantle 会处理这个问题(至少快速查看它的源代码告诉我的内容是这样的)。

不幸的是,当我从核心数据中取回对象时

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

post 对象上的属性评论是一个空的 NSSet,我在事先插入该东西时遇到了很多错误。我得到的错误:

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

我被卡住了-也许我在这里遗漏了一些巨大的东西?

我的 Post Class 实现了以下静态方法:

+ (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转换为。NSMutableArrayivar

例如:

- (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 回答