3

我正在尝试从获取请求中获取对象,并且正在检查该对象的属性。

根据属性的类型,我是否会显示通知。成功连接后,我将对象的属性类型从“已插入”设置为“已更新”。然后,当我刷新视图时,我从 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;
4

1 回答 1

0

@Arcanfel 的建议(在对原始问题的评论中)确实帮助我找到了解决我自己问题的方法,但它隐藏在“显示更多评论”部分中。

将其视为答案而不是评论会很有帮助,因此我接受了他的评论并对其进行了一些扩展。

原评论:

[self managedObjectContextForCurrentThread] - 我认为这可能会导致问题,因为不同的上下文可以有不同版本的 NSManagedObjects。您可以调用 [fetchReq setShouldRefreshRefetchedObjects:YES],它将返回您的对象的最新版本

虽然使用 setShouldRefreshRefetchedObjects:YES 并没有解决我的后续提取请求没有带回正确数据的问题,但它确实让我查看了我的上下文管理。

在一种方法中,我设置了上下文,然后读取数据。在另一种方法中,我设置了另一个上下文,读取数据,更改它,然后保存该上下文......与我的第一个方法所具有的不同上下文。

简而言之,请注意您指的是相同的上下文,或者您在 context1 中更新的任何内容都不会与您从 context2 中检索到的内容同步。

于 2017-01-24T22:55:53.773 回答