从 fetch 请求返回的对象包含不正确的数据
Posted
技术标签:
【中文标题】从 fetch 请求返回的对象包含不正确的数据【英文标题】:Object returned from fetch request has incorrect data 【发布时间】:2013-09-03 18:14:54 【问题描述】:我正在尝试从获取请求中获取对象,并且正在检查该对象的属性。
根据属性的类型,我是否会显示通知。成功连接后,我将对象的属性类型从“已插入”设置为“已更新”。然后,当我刷新视图时,我从 coredata 中提取所有对象并检查它们的属性是否为“更新”类型。我遇到的问题是,我刚刚尝试更改为“更新”的提取请求中返回的对象仍然显示提取请求中的旧“插入”值,但在提交后不会立即显示。就像他们正在恢复一样。 (我正在保存上下文)
更令人困惑的是我有一个程序来查看存储在设备上的数据库文件中的实际表,它实际上显示了表中更新的正确值。但是获取请求仍然返回带有不正确数据的对象。再多的刷新也无法解决问题。
当 coredata 文件显示具有正确值的表时,获取请求如何为我提供具有旧/不正确数据的对象?
// code for the fetch request
// return an array of all assets for a specific customer
NSFetchRequest *fetchReq = [NSFetchRequest fetchRequestWithEntityName:@"Asset"];
fetchReq.predicate = [NSPredicate predicateWithFormat:@"customerID = %@" argumentArray:[NSArray arrayWithObject:customerID]];
NSArray *results = [[CoreDataManager sharedManager] executeFetchRequest:fetchReq];
return results;
//executeFetchRequest method
NSManagedObjectContext *context = [self managedObjectContextForCurrentThread];
NSArray *results = [context executeFetchRequest:fetchRequest error:&error];
return results;
【问题讨论】:
发布您如何创建获取请求的代码。如果您在与保存相同的上下文中提取,您可以在再次执行提取请求之前尝试重置上下文。 添加了获取请求 “属性类型”如何存储?属性的名称/类型? 属性的名称是什么? (我问是因为某些属性名称会导致奇怪的效果,例如“已删除”或“已更新”。) [self managedObjectContextForCurrentThread] - 我认为这可能会导致问题,因为不同的上下文可以有不同版本的 NSManagedObjects。您可以调用 [fetchReq setShouldRefreshRefetchedObjects:YES],它会返回您的对象的最新版本。 【参考方案1】:@Arcanfel 的建议(在原始问题的 cmets 中)确实帮助我找到了解决我自己问题的方法,但它隐藏在“显示更多 cmets”部分中。
将其视为答案而不是评论会很有帮助,因此我采纳了他的评论并对其进行了一些扩展。
原评论:
[self managedObjectContextForCurrentThread] - 我认为这可能会导致 问题,因为不同的上下文可以有不同的版本 NSManagedObjects。你可以调用 [fetchReq setShouldRefreshRefetchedObjects:YES] 会返回最多的 对象的最新版本
虽然使用 setShouldRefreshRefetchedObjects:YES 并没有解决我的后续提取请求没有带回正确数据的问题,但它确实让我查看了我的上下文管理。
在一种方法中,我设置了上下文,然后读取数据。在另一种方法中,我设置了另一个上下文,读取数据,更改它,然后保存该上下文......与我的第一个方法所具有的不同的上下文。
简而言之,请注意您指的是相同的上下文,或者您在 context1 中更新的任何内容都不会与您从 context2 中检索到的内容同步。
【讨论】:
以上是关于从 fetch 请求返回的对象包含不正确的数据的主要内容,如果未能解决你的问题,请参考以下文章
PHP mysqli_fetch_assoc 没有返回正确的值