神奇的记录 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 更改保存不工作的主要内容,如果未能解决你的问题,请参考以下文章