核心数据在 App 重启之前不会改变

Posted

技术标签:

【中文标题】核心数据在 App 重启之前不会改变【英文标题】:Core Data not changing until App restart 【发布时间】:2012-07-22 15:28:07 【问题描述】:

我有一个核心数据模型,可以很好地导入和导出数据。我的应用程序的工作方式是从数据库下载 JSON 文件,对其进行解析,刷新核心数据模型,然后再次添加数据(实际上是刷新本地数据模型)。​​

如果我对数据库进行更改,更改会反映在 JSON 文件中,但不会反映在核心数据模型中,直到我重新启动(也就是结束应用程序,再次打开)应用程序。

我确定这一定与我刷新数据库的方式有关,但我就是无法确定。我在下面添加了一些代码来提供帮助。

我用来刷新数据模型的方法:

- (void)resetCoreData;
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppWithCoreData.sqlite"];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    [fileManager removeItemAtURL:storeURL error:NULL];

    NSError* error = nil;

    if([fileManager fileExistsAtPath:[NSString stringWithContentsOfURL:storeURL encoding:NSASCIIStringEncoding error:&error]])
    
        [fileManager removeItemAtURL:storeURL error:nil];
    

    persistentStoreCoordinator = nil;
    managedObjectContext = nil;

    [self managedObjectContext]; // Rebuild Object Context    

我用来将数据添加到数据模型的一行代码:

[model setValue:[dictionary objectForKey:@"eventID"] forKey:@"eventID"];

【问题讨论】:

之后你会重新获取数据吗?也看看这个:***.com/a/5770216/730701。唯一的区别是你在将上下文设置为 nil 之前删除了文件,然后那个人会这样做。 是的,我调用了这个方法,然后重新获取数据。它保存没有任何错误。当我在设置上下文后移动这两行后尝试保存时,出现错误无法保存:操作无法完成。 (可可错误 134030。) 【参考方案1】:

通常当您需要将更改保存到核心数据存储时,您需要保存它们。

要实现它,您需要调用

NSError* error = nil;
[managedObjectContext save:&error];

通过这种方式,您所做的更改将保存到磁盘。事实上,当你简单地改变,例如,特定实体的属性值时,它只在内存中可用。

我想这些更改仅在下次重新启动时可用,因为在您的应用程序委托中您侦听 applicationWillTerminate 委托并在那里保存上下文。你在使用 Xcode 模板提供的 Core Data Stack 吗?

如果可能,请提供更多详细信息,也许我可以帮助您。

希望对您有所帮助。

【讨论】:

对不起,我正在调用保存,我只是愚蠢地忽略了它。我没有使用核心数据模板,之后我添加了核心数据。关于核心数据的其他一切都有效,但这个。感谢您迄今为止的帮助。 @AlexGodbehere 你能提供一些其他细节吗? 好的,我有更新。我已经在应用程序启动后下载了模型中的数据,但在我通常删除数据并添加新数据之前。结果……空。因此,数据首先不能被保存。我觉得这很奇怪,因为它没有报告错误。您还想了解哪些其他信息? @AlexGodbehere 抱歉耽搁了。您能否扩展您的问题以添加您尝试过的内容? 一开始就不能保存数据是什么意思?谢谢。 当然!基本上,我的应用程序中有一个登录屏幕,当用户使用它登录时,它会显示主视图控制器。在这个 VC 的 didLoad 方法中,我从服务器下载数据,解析 JSON 文件,“刷新”数据模型并导入新下载的数据。我已向此视图控制器添加了一个调试“打印数据模型到控制台”。在初始下载后按下时,它会显示反映服务器数据的正确数据。例如,我现在将删除服务器上的一条记录。

以上是关于核心数据在 App 重启之前不会改变的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中设置时间,重启后不会改变?

如何滚动重启pod而不改变kubernetes(k8s)中的部署yaml?

核心数据:重启时排序的一对多关系

用爱加速切换IP后重启路由器后会不会回到原IP

路由器重启以后ip是不是会改变

Hadoop namenode高可用性分析:QJM核心源代码解读