核心数据在启动之间不持久

Posted

技术标签:

【中文标题】核心数据在启动之间不持久【英文标题】:core data not persisting between launches 【发布时间】:2013-05-23 17:12:39 【问题描述】:

我在使用 Core Data 时遇到了一个奇怪的问题。在一个特定的视图控制器中,我从 Core Data 中的对象加载视图。当我运行该应用程序时,它第一次加载此视图时,Core Data 不会从我的获取中返回任何内容。所以我重新填充核心数据,每次显示视图时,它都会正确地从核心数据中获取对象。但是,每次启动应用程序时,它都不会在 Core Data 中找到任何内容,然后必须再次从头开始创建对象。

那么,什么会导致 Core Data 对象在应用程序运行时持续存在,但在启动之间不存在呢?我没有做任何事情来删除任何对象。

编辑:有没有办法查看 Core Data 中的实际内容?像文件或我可以查看的东西?这样会更容易调试。

【问题讨论】:

如何创建持久存储、协调器和上下文? 也许您没有保存更改。这似乎不太可能,但如果没有一些代码或至少对其工作原理的良好描述,这是第一个也是最明显的可能性。 好吧,这里要粘贴的代码太多了,所以我只是想知道是否存在可能导致这种情况的情况。经过进一步测试,它似乎发生在模拟器中,但不在设备上。设备会识别存储的数据并且不会从头开始创建对象。知道为什么模拟器不会持续存在吗? 当您在 Core Data 中保存更改但失败时,您会收到一个“NSError”,告诉您发生了什么。你检查过这个吗?它说了什么? 示例代码对您有用吗?您的代码与示例代码有何不同? 【参考方案1】:

确保在更改后保存上下文。 模板方法是:

- (void)saveContext 
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) 
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NKLOG(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        
    

如果你想打开你的数据库,你可以试试这个名为SQLite Manager的firefox插件

然后搜索您的 .sqlite 文件,您的应用的默认路径是:

/用户/YOUR_USER/图书馆/应用程序支持/iPhone 模拟器/ios_VERSION/Applications/GENERATED_HASH/Documents/YOUR_APP.sqlite

【讨论】:

你提到的firefox插件看起来很有用。我已经安装了它,但是如何将它指向我应用的核心数据数据库文件? 不要介意火狐的问题。我想通了。 self.objectContext save: 和 [[CoreDataController sharedController] saveContext]; 有什么区别? ?看来我必须两者兼得?【参考方案2】:

可以通过查找模拟器放置应用程序的位置来检查应用程序的所有文件。您可以使用NSLog( @"My database is at: '%@'", theDatabaseURL.path ); 将其删除

由于您在 NSManagedObjectContext 中所做的一切都保存在内存中,因此它会在应用程序运行时持续存在,但如果持久性存储设置不正确或保存不正确,则在下次启动应用程序时消失是有意义的操作未触发。

如果您展示了您打开、初始化和保存数据的代码部分,这可能会有所帮助。

【讨论】:

以上是关于核心数据在启动之间不持久的主要内容,如果未能解决你的问题,请参考以下文章

目录在 iOS 应用程序启动之间不持久

需要一个持久的地方来存储我的核心数据存储的备份

无法使用 RestKit 0.20 在构建之间持久化数据

核心数据模板:运行之间不持久的数据

PackageManager.getComponentEnabledSettings() 在冷启动之间是不是持久?

在应用程序启动之间保留数据