CoreData - 不在 NSSet 上保存关系或外键详细信息

Posted

技术标签:

【中文标题】CoreData - 不在 NSSet 上保存关系或外键详细信息【英文标题】:CoreData - Not saving relationships or foreign key details on NSSet 【发布时间】:2013-07-05 12:48:21 【问题描述】:

在决定在 SO 中发帖之前,我搜索并查看了大多数核心数据问题。这有点奇怪,我不知道从哪里开始。

我正在构建一个 ios 应用,我正在使用 RestKit、Core Data 和 Objective Record。在详细介绍之前,请注意我的 Object Context 和 Object Store for Objective Record 和 RKObjectManager 是相同的。所以我不是在相同的上下文之外引用对象。足够的介绍..

Feed_Items 模型是层次结构中的***模型。

--Feed_Items

------OutFit 模型(1 对 1 / 可选)

------服装模型(1-t0-1 / 可选)

衣服和服装都有相同的属性集,我对 'cmets' 属性特别感兴趣

--衣服/服装

------其他字段

------NSSet* 评论对象

当我启动应用程序时,我使用 RestKit(json) 和 Object-Mapping 从服务器加载所有最新的提要。在第一次加载时,我只得到 1 个作为装备的提要项目,并且该装备总共有 7 个 cmets,其中 5 个是最初加载的。到目前为止一切顺利,我得到了 Feed_Item 对象和相应的 Outfit 以及 NSSet 中的 5 个 cmets。

现在当用户想要加载所有以前的 cmets 时,我调用另一个 API,它返回 2 个新 cmets,这些 cmets 被成功解析为 Comment 对象。

[objectManager getObjectsAtPath:[NSString stringWithFormat:@"api/outfit/comments/%d",[_feed.outfit.outfit_id intValue]]
             parameters:_params
                success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
                    for( Comment* _comment in [mappingResult array])
                        [_feed.outfit addCommentsObject:_comment];
                        [_comment save];
                    
                
                failure:^(RKObjectRequestOperation *operation, NSError *error) 

                ];

没有任何异常或错误,但是我怀疑最后 2 个 Comment 对象的外键没有在 sqlite db 中更新。请看下图

为了进一步证明我的观点,我在第二次运行时尝试了以下操作

Outfit *_outfit = [[Outfit where:@"outfit_id == 3"] objectAtIndex:0];
NSLog(@"%@", [_outfit.comments allObjects]);

只有 5 个对象

"<Comment: 0xc185ed0> (entity: Comment; id: 0xc185840 <x-coredata://2C61C98F-0B5F-4111-B681-1E43ABFB33D4/Comment/p6> ; data: <fault>)",
"<Comment: 0xc185c00> (entity: Comment; id: 0xc185820 <x-coredata://2C61C98F-0B5F-4111-B681-1E43ABFB33D4/Comment/p1> ; data: <fault>)",
"<Comment: 0xc185f10> (entity: Comment; id: 0xc185850 <x-coredata://2C61C98F-0B5F-4111-B681-1E43ABFB33D4/Comment/p8> ; data: <fault>)",
"<Comment: 0xc185f70> (entity: Comment; id: 0xc185860 <x-coredata://2C61C98F-0B5F-4111-B681-1E43ABFB33D4/Comment/p9> ; data: <fault>)",
"<Comment: 0xc185e90> (entity: Comment; id: 0xc185830 <x-coredata://2C61C98F-0B5F-4111-B681-1E43ABFB33D4/Comment/p4> ; data: <fault>)"

我不知道最后 2 个对象发生了什么以及为什么它没有连接。从图像中可以看出,它已成功保存在数据库中,但看起来关系或外键未设置。知道出了什么问题吗?

干杯

【问题讨论】:

这 2 个请求中使用的映射和返回的 JSON 是什么? 【参考方案1】:

对于使用 RestKit + Core Data + Objective Record 的用户,请确保修改 NSManagedObject+ActiveRecord.m 中的 saveTheContext 方法,如下所示。

- (BOOL)saveTheContext 
    if (self.managedObjectContext == nil ||
        ![self.managedObjectContext hasChanges]) return YES;

    NSError *error = nil;
    BOOL save = [self.managedObjectContext saveToPersistentStore:&error];
    if (!save || error) 
        NSLog(@"Unresolved error in saving context for entity:\n%@!\nError: %@", self, error);
        return NO;
    

    return YES;
 

这里要注意的是对 saveToPersistentStore 的调用,它是 NSManagedObjectContext 上的 RKAdditions 类别。没有这个 RestKit 初始化对象将不会在持久存储中保存任何更改。

我花了一天时间才弄明白。

【讨论】:

以上是关于CoreData - 不在 NSSet 上保存关系或外键详细信息的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Objective-C/CoreData:以一对多关系编辑NSSet

CoreData如何将项目添加到与实体相关的NSSet

用 CoreData 对象填充 NSSet

核心数据 [NSSet intersectsSet:]:set 参数不是 NSSet

使用搜索栏在 CoreData 中搜索 NSSet 属性

将对象添加到 NSSet 时与 Core Data 的反比关系导致崩溃