English 中文(简体)
回收的核心数据实体
原标题:Restkit-loaded nested Core Data entities cause NSObjectInaccessibleException

I m using RestKit to grab objects from my RoR service and using CoreData to persist some of the objects (more static-type lookup table objects). TasteTag is one of those persisted objects:

#ifdef RESTKIT_GENERATE_SEED_DB
    NSString *seedDatabaseName = nil;
    NSString *databaseName = RKDefaultSeedDatabaseFileName;
#else
    NSString *seedDatabaseName = RKDefaultSeedDatabaseFileName;
    NSString *databaseName = @"Model.sqlite";
#endif

RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:kServerURL];  
manager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:databaseName usingSeedDatabaseName:seedDatabaseName managedObjectModel:nil delegate:self];

.. lots of fun object mapping ..

 RKManagedObjectMapping* tasteTagMapping = [RKManagedObjectMapping mappingForClass:[TasteTag class]];
[tasteTagMapping mapKeyPath:@"id" toAttribute:@"tasteTagID"];
[tasteTagMapping mapKeyPath:@"name" toAttribute:@"name"];
tasteTagMapping.primaryKeyAttribute = @"tasteTagID";
[[RKObjectManager sharedManager].mappingProvider setMapping:tasteTagMapping forKeyPath:@"taste_tags"]; 
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:tasteTagMapping];

.. some more mapping ..

I have the data coming back from the RoR server and it s getting mapped to objects as expected. The Core Data entity also seems mapped fine after RestKit gets the request back:

"<TasteTag: 0x6e87170> (entity: TasteTag; id: 0x6e85d60 <x-coredata://03E4A20A-21F2-4A2D-92B4-C4424893D559/TasteTag/p5> ; data: <fault>)"

问题是,当我试图在物体上获取财产时,过错似乎会发生火灾。 首先,我只是说,这些财产总是回落为零(即使这会造成过失):

for (TasteTag *tag in self.vintage.tasteTags) {
    [tagNames addObject:tag.name]; //get error of trying to add nil to array   
}

http://www.mlsite.net/blog/?p=518"。 我试图打上<条码>[标注将AccessValueForKey:nil],结果如下:

Terminating app due to uncaught exception  NSObjectInaccessibleException , reason:  CoreData could not fulfill a fault for  0x6e7b060 <x-coredata://03E4A20A-21F2-4A2D-92B4-C4424893D559/TasteTag/p5>  

根据关键因素(Tasteg/p5)对实体进行盘点,确实显示它符合我的期望。

与Resit有关的其他员额建议取消目标海滩(我不使用该物体),因为通常由实体删除。 但在这个阶段,我只是读,而不是删除,我没有切身之处。

如果我只打电话[TasteTag allObjects] I m 能够收回所有物体的罚款,并且无问题装载。 在他们被错过的情况下,似乎只是这样。

最佳回答

记录每瑞安建议中的我方位(读:hack)。

这里的错误似乎在于RethKit如何使用从objectLoader:didLoadObjects:方法中返还的物体。 他们似乎认为,所有数据都将得到核心数据的支持(并沿途类似于瑞安所说的流动——让数据与核心数据相提,然后重新排列),或者你正在使用所有非核心数据支持的物体,并且只是保持这些结果。

在我的案件中,我有一个组合,即一系列非核心数据支持的物体,各包含一系列核心数据支持的实体。 顶级物体是我不把服务器问到的物体,也没有理由在当地停留,超出其重新显示的观点。 看来,<条码>目标定位:didLoadObjects:完成了在<条码>内支持核心数据实体的管理目标环境。 第2款处理(根据您的舱位重新排列的假设),导致今后向各实体发出任何要求,要求它们作为过失处理,即使你可以引发错误和数据载荷(<代码>NSObject InaccessibleException)。

我在座标上有一个格朗克——在<条码>内:didLoadObjects:。 我可以查阅核心数据实体之一管理物体的背景,将其复制到电文中的一种财产( un.context = [tag managementObjectContext];。 这使得它无法在<条码>标书:didLoadObjects: 之后释放,使我得以在稍后阶段就与这些实体接触。

另一种解决办法是,利用新的背景,对每个实体进行人工重新排序,并抄送储存的返回物体。 如果有人要展示这些内容,或者可能的话,可在<条码>中进行某些后处理:didLoadObjects:,使用新的背景。 实体ID仍然处在被错乱的物体上,因此即使在原有的“ResKit”环境消失之后,也可以使用该物体重新排序,而无需发行。 但是,在像这样的物体图表中,似乎必须重新排列每个实体的顺序。

问题回答

我为我找到了一种解决办法(我不知道它如何适用于你的情况,但我补充说,这是解决办法,因为它解决了我(或非常相似)的问题:

A couple days back, I ran the RKTwitterCoreData example and noticed it worked perfectly while mine, with very simple code at this point and doing nearly the same thing, didn t. I got a lot of unfulfilled faults. So I decided to modify all of my code dealing with RestKit to reflect how the RKTwitterCoreData example does it.

I ll split this into chunks to try and help you follow my line of thinking at the time (since I don t think our problems are identical).

http://www.ohchr.org。

休息 包件可以回馈核心数据,我假定这些管理物体可以互换使用。 例如,我可以与从远程网络服务检索的物体完全一样使用核心数据中的物体。 我甚至可以将这些数据合并起来,以获得所有数据。

I Was Wrong

我注意到,RKTwitterCoreData s代码至少是not。 我的法典中一个象样的chu子,但最大的区别是,它们把这些物体视为可互换的。 事实上,它们使用的是never>从遥远的数据储存处提取的物体。 相反,他们只是让这种“通过裂缝陷落”。 我只能假设,这意味着它们由于为它们工作,而现在为我工作,就重新加入核心数据储存。

<> 详情>

我在修改我的守则以利用这一流动之后做了工作。 我只能补充一点,我们所看到的无法填补的错误与使用我们从网站<>上接回的核心数据支持物体有关。 如果你只是无视这些要求,然后做手法,那么你就会回头来(包括最近的请求),你就没有留下任何无法弥补的错误。

详细论述,请看 RKTwitterViewController 您将注意到处理装载物体的第45-61条线:

- (void)loadObjectsFromDataStore {
    [_statuses release];
    NSFetchRequest* request = [RKTStatus fetchRequest];
    NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO];
    [request setSortDescriptors:[NSArray arrayWithObject:descriptor]];
    _statuses = [[RKTStatus objectsWithFetchRequest:request] retain];
}

- (void)loadData {
    // Load the object model via RestKit    
    RKObjectManager* objectManager = [RKObjectManager sharedManager];
    [objectManager loadObjectsAtResourcePath:@"/status/user_timeline/RestKit" delegate:self block:^(RKObjectLoader* loader) {
        // Twitter returns statuses as a naked array in JSON, so we instruct the loader
        // to user the appropriate object mapping
        loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[RKTStatus class]];
    }];
}

一切都看上去正常(至少与我最初如何这样做相比)。 但对<代码>objectLoader:didLoadObjects:进行研究。 分配方法:

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
    [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"LastUpdatedAt"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"Loaded statuses: %@", objects);
    [self loadObjectsFromDataStore];
    [_tableView reloadData];
}

样本甚至触及<条码>目标参数! (除NS Carlo外,当然......)

<><>Conclusion/tl>;dr

http://www.objectLoader:didLoadObjects:。 如果它们得到核心数据的充分支持的话。 相反,忽视了这些数据,并从核心数据中重新计算。 所有物体,包括最后一项请求中的物体在内,都存在。 否则,你将面临无法弥补的过失(至少我是这样)。





相关问题
List Contents of Directory in a UITableView

I am trying to list the contents of Ringtones directory in a TableView, however, I am only getting the last file in the directory in ALL cells, instead of file per cell. This is my code: - (...

iPhone NSUserDefaults persistance difficulty

In my app i have a bunch of data i store in the NSUserdefaults. This information consists of an NSObject (Object1) with NSStrings and NSNumbers and also 2 instances of yet another object (Object2). ...

Writing a masked image to disk as a PNG file

Basically I m downloading images off of a webserver and then caching them to the disk, but before I do so I want to mask them. I m using the masking code everyone seems to point at which can be found ...

Resize UIImage with aspect ratio?

I m using this code to resize an image on the iPhone: CGRect screenRect = CGRectMake(0, 0, 320.0, 480.0); UIGraphicsBeginImageContext(screenRect.size); [value drawInRect:screenRect blendMode:...

Allowing interaction with a UIView under another UIView

Is there a simple way of allowing interaction with a button in a UIView that lies under another UIView - where there are no actual objects from the top UIView on top of the button? For instance, ...