核心数据在 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 重启之前不会改变的主要内容,如果未能解决你的问题,请参考以下文章