当更新版本已经在内存中时,强制核心数据从以前存储的版本刷新 NSManagedObject

Posted

技术标签:

【中文标题】当更新版本已经在内存中时,强制核心数据从以前存储的版本刷新 NSManagedObject【英文标题】:Forcing Core Data to refresh an NSManagedObject from a previous stored version when an updated version is already in memory 【发布时间】:2013-02-01 01:14:39 【问题描述】:

在我正在编写的基于文档的 ios 应用程序中,我无法强制 Core Data 刷新我的一些 NSManagedObject 子类。

问题在于处理用户加载第二个文档而当前文档中有未保存的更改的情况 此时,如果用户再次加载第一个文档,未保存的更改就会显示出来。 使用文档根对象的 NSFetchRequest 加载文档。此获取请求的属性 -setShouldRefreshRefetchedObjects: 设置为 YES 和属性 -setIncludesPendingChanges: 设置为 NO 我确定它们没有被保存到持久存储中,因为终止应用程序并重新启动它会导致原始未更改的文档出现。另外,我打开了 SQL 调试,它显示应用程序第二次没有从相关表中获取数据

【问题讨论】:

【参考方案1】:

我知道这个问题已经回答了,但是使用 NSManagedObjectContext 的 refreshObject:mergeChanges: 方法呢?

见NSManagedObject Class Reference refreshObject:mergeChanges:

【讨论】:

【参考方案2】:

This link 可能会对您有所帮助,它添加了一个用于恢复对 NSManagedObject 的更改的类别。祝你好运。

#import "NSManagedObject+RevertChanges.h"

@implementation NSManagedObject (NSManagedObject_RevertChanges)

- (void) revertChanges 
    // Revert to original Values
    NSDictionary *changedValues = [self changedValues];
    NSDictionary *committedValues = [self committedValuesForKeys:[changedValues allKeys]];
    NSEnumerator *enumerator;
    id key;
    enumerator = [changedValues keyEnumerator];

    while ((key = [enumerator nextObject])) 
        NSLog(@"Reverting field ""%@"" from ""%@"" to ""%@""", key, [changedValues objectForKey:key], [committedValues objectForKey:key]);
        [self setValue:[committedValues objectForKey:key] forKey:key];
    

【讨论】:

感谢@StefanKendall 的建议。只是想帮助他,我想应该是评论。但是,我现在无法删除此答案,因为它似乎确实有帮助,因为他将其标记为正确答案。 为后代复制代码。这就是一个答案。 啊,我明白了。我被你的评论弄糊涂了。

以上是关于当更新版本已经在内存中时,强制核心数据从以前存储的版本刷新 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章

强制核心数据更新模型

当我们保存在 NSUserDefaults 中时,从核心数据和应用程序中获取“<NULL>”数据会崩溃?

核心数据“找不到源存储模型”;

swift - 当persistentContainer不在App委托方法中时如何从核心数据中删除所有数据

当更新的应用程序将显示在 Play 商店中时,分阶段推出

如何在 cellEdit 之后强制从持久存储重新加载核心数据