神奇的记录 NSFetchedResultsController NSManagedObject 更改保存不工作

Posted

技术标签:

【中文标题】神奇的记录 NSFetchedResultsController NSManagedObject 更改保存不工作【英文标题】:Magical Record NSFetchedResultsController NSManagedObject Changes Save Not Working 【发布时间】:2014-09-22 11:48:41 【问题描述】:

我已经使用 NSFetchedResultController 将数据加载到 UITableView 中。我正在使用 MagicalRecord 进行 coredata 操作。

我在默认上下文中创建了 NSFetchedResultsController,并在 didSelectRowAtIndexPath 上使用了它,如下所示

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
[tableView deselectRowAtIndexPath:indexPath animated:YES];
UserEntity * user = [userFetchedResultsController objectAtIndexPath:indexPath];

// do some changes to user Object 

稍后在保存按钮单击操作时,我尝试像下面那样保存

[[NSManagedObjectContext defaultContext] saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) 
    DLog(@" isSaved : %d ",success);
];

但未保存更改,

2014-09-22 17:12:50.752 _block_invoke [Line 210] has Changed 1
2014-09-22 17:12:50.752 MR_saveWithOptions:completion:](0x7fca7214e7d0) → Saving <NSManagedObjectContext (0x7fca7214e7d0): *** DEFAULT ***> on *** MAIN THREAD ***

2014-09-22 17:12:50.753 MR_saveWithOptions:completion:](0x7fca7214e7d0) → Save Parents? 1

2014-09-22 17:12:50.753 MR_saveWithOptions:completion:](0x7fca7214e7d0) → Save Synchronously? 0

2014-09-22 17:12:50.759 MR_saveWithOptions:completion:](0x7fca7214c430) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING

2014-09-22 17:12:50.759 _block_invoke_2 [Line 213]  isSaved : 0 

显然 NSManagedObject 有 Changes ,但日志显示 No Changes ,谁能解释一下这个?

更新:

我可以在 defaultContext UpdatedObjects 列表中看到更改后的对象,但仍然没有保存不工作

DLog(@" updated Objects %@ ",  [[NSManagedObjectContext defaultContext] updatedObjects]);

 updated Objects (
<UserEntity: 0x1780cd4a0> (entity: UserEntity; id: 0xd000000000040000 <x-coredata://1E0810DA-1A23-4337-B279-3957BE4D207F/UserEntity/p1> ; data: 
   // entity data removed 
)
) 

NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING

任何建议都会很有帮助

更新 2:

下面是我如何创建 NSFetchedResultsController

-(NSFetchedResultsController*) userFetchedResultsController 
@autoreleasepool 
    if(userFetchedResultsController == nil)

        NSFetchRequest *fetchRequest = [UserEntity requestAllSortedBy:@"userName" ascending:YES];
        [fetchRequest setFetchBatchSize:10];

        NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[NSManagedObjectContext defaultContext] sectionNameKeyPath:nil cacheName:nil];

        userFetchedResultsController = theFetchedResultsController;
        userFetchedResultsController.delegate = self;
    
    return userFetchedResultsController;


【问题讨论】:

请在您进行更改的地方插入代码。然后,您可以记录 [context updatedObjects] 以查看哪些对象有更新:) 嗨 daniel,我可以在 updatedObjects 中看到更改后的 UserEntity 对象,但是当我尝试保存它时说像以前一样没有更改 ** 背景保存(根)** 上下文 - 不保存 为了更好地理解,我需要查看您正在使用哪些 NSManagedObjectContexts:设置获取的结果控制器并更新对象。 我使用了由魔法记录创建的 defaultContext,检查更新 2 以了解如何创建 NSFetchedResultsController 为了更新我使用任何上下文而不是我只需从 nsfetchedresultscontroller 获取数据并更新更改。 【参考方案1】:

这实际上是我这边的一个逻辑错误,它重置了 NSManagedObject 值,导致上下文没有变化。

现在更新工作正常。

【讨论】:

以上是关于神奇的记录 NSFetchedResultsController NSManagedObject 更改保存不工作的主要内容,如果未能解决你的问题,请参考以下文章

神奇的记录:总和聚合

神奇的记录排序错误

一对多的神奇记录

神奇的记录只保存内存

神奇的记录 将大量数据保存到数据库

并发的神奇记录