获取 Persistent Storage 中的 MappingResult firstObject 值,避免出现“非法建立关系”错误

Posted

技术标签:

【中文标题】获取 Persistent Storage 中的 MappingResult firstObject 值,避免出现“非法建立关系”错误【英文标题】:Get the MappingResult firstObject value within the Persistent Storage to avoid "Illegal attempt to establish relationships" errors 【发布时间】:2013-07-22 14:28:17 【问题描述】:

我正在从persistentStoreManagedObjectContext 获取一个对象,并在 UIView 中向我的用户显示它的一些价值。那个对象,我们称之为Book 有一个Author 关系。每当我要展示那本书时,我都会检查作者是否已设置。如果没有设置,我会这样做:

    [[RKObjectManager sharedManager] getObjectsAtPath:[NSString stringWithFormat:@"/api/rest/userprofiles/%@/",_currentBook.authorID] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) ..

在成功回调中,我想做一个:

 _currentBook.author = mappingResult.firstObject;
 if (![_currentBook.managedObjectContext saveToPersistentStore:&error]) 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
 

但是,我不能这样做_currentBook.author = mappingResult.firstObject;,因为我得到:

Illegal attempt to establish a relationship between objects in different contexts

但是,我知道这个新获取的Author 保存在persistentStoreCoordinator 中,因为我将RestKit 配置为这样做(或者默认情况下,我不记得了)。所以我不想再次创建该对象,我只想在我的 currentContext 中获取它的值,即persistentStoreManagedObjectContext。我必须为此使用 NSFetchedResultsController 吗?

编辑

我在书中已经有一个连接,可以通过 authorID 连接到作者,我在从服务器获取 Book 对象的同时将其发回。但是,可能是尚未获取作者对象的情况,因此我保留了该 ID。

[bookMapping addConnectionForRelationship:@"author" connectedBy:@ @"authorID": @"identifier" ];

但是,即使在获取该作者之后,book.author 也会设置为 null,除非我在持久存储中再次 REFETCH。

【问题讨论】:

【参考方案1】:

您应该让 RestKit 使用基于作者 ID 的外键映射来连接关系。这样一来,所有的更新都会在相同的上下文中同时进行,并在映射结果返回之前保存。

【讨论】:

请参阅编辑。我已经在这样做了,但我并没有在作者之间保持逆向,因为作者本质上是一个用户,这与许多其他事情有关。

以上是关于获取 Persistent Storage 中的 MappingResult firstObject 值,避免出现“非法建立关系”错误的主要内容,如果未能解决你的问题,请参考以下文章

Exception loading sessions from persistent storage

c_cpp #Persistent Storage.c

[Docker] Create Docker Volumes for Persistent Storage

Exception loading sessions from persistent storage

Exception loading sessions from persistent storage

tomcat错误之:Exception loading sessions from persistent storage java.io.EOFException