ios - MagicalRecord 保存不会持续存在,直到应用程序第一次退出并重新运行

标签 ios core-data magicalrecord

我不确定这是核心数据问题还是 MagicalRecord 问题。

我的应用程序使用 MagicalRecord 来帮助使用 CoreData。当应用程序在安装后第一次运行时,当我保存新对象,然后应用程序退出并再次运行时,这些对象不存在。但是,在第一次重新运行应用程序之后创建的任何新对象都会正常保留。它仅在应用程序新鲜且数据库为空时发生。当应用程序运行一次后,即使数据库为空(通过下载应用程序并提取 sqlite 文件并在我的 Mac 上打开它来确认),它也会从那时起运行。

在我的应用委托(delegate)中,我执行以下操作

    [MagicalRecord setupAutoMigratingCoreDataStack];

该应用正在保存它收到的推送通知,以便该应用可以列出已发生的事件。所以当推送通知进来时,这段代码运行

     _currentNotification = [PNotificationEntry MR_createEntity];

     _currentNotification.* = <new value>; // set all kinds of attributes

     [[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
            if (nil != error)
               {
                  NSLog(@"failure to save notification entry");
                  }
               else 
               {
                  NSLog(@"successful save of notification entry"):
                  }
            }];

我知道它保存了,因为控制台中的神奇记录显示它成功并且 NSLog 显示它,更重要的是,一个正在监视更改的 NSFetchedResultsController 拾取新对象并显示它。

但是一旦应用程序退出并重新运行,插入的对象都不会出现在 sqlite 文件中,也不会显示出来。但同样,如前所述,一旦应用程序在安装后退出一次,它现在就会开始正确地持久化对象,并且在下次运行该应用程序时您确实会看到这些对象。

在安装后的第一次运行中,应用程序是否尝试插入对象并不重要。应用程序的第二次运行一切正常。

我对可能发生的事情一头雾水。

MagicalRecord 版本是上周 github 上的最新版本。

最佳答案

您可能看不到更改,因为您正在使用 MR_contextForCurrentThread。自从引入 GCD 队列以来,这种方法存在根本性缺陷,并且已被弃用。我在 my blog 上完成了这个.

当您使用 MR_createEntity 时,如果没有指定 NSManagedObjectContext,您需要保存默认上下文,因为这是您所有数据所在的位置:

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

您的清理解决方法是不必要的,而且很可能会丢失数据。

关于ios - MagicalRecord 保存不会持续存在,直到应用程序第一次退出并重新运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752460/

相关文章:

ios - 单击横幅广告时的 AdMob 事件

ios - 如何将最新版本的通行证与旧版本进行比较以确定哪些字段已更改?

swift - 如何在 NSSet Core Data (Swift) 中保存值

ios - CoreData vs. SQLite vs. 自定义实体和 pLists

ios - Coredata fetch 不返回刚刚写入存储的结果

ios - 根据文本调整 UIButton 大小的最简单方法

iphone - MKMapView 更改 View 中的物理位置

ios - 默认上下文为零!你忘记初始化核心数据栈了吗? [魔法唱片]

swift - 实体名称为零的核心数据实体

ios - 按名称的第一个字符对 tableView 进行分组