MagicalRecord 保存在应用程序第一次退出并重新运行之前不会持续存在
Posted
技术标签:
【中文标题】MagicalRecord 保存在应用程序第一次退出并重新运行之前不会持续存在【英文标题】:MagicalRecord save does not persist until app is quit the first time and rerun 【发布时间】:2013-09-11 22:39:07 【问题描述】:我不确定这是 Core Data 问题还是 MagicalRecord 问题。
我的应用程序使用 MagicalRecord 来帮助使用 CoreData。当应用程序在安装后第一次运行时,当我保存新对象,然后应用程序退出并再次运行时,这些对象不存在。但是,在第一次重新运行应用程序之后创建的任何新对象都会正常保留。它仅在应用程序新鲜且数据库为空时发生。当应用程序运行一次时,即使数据库是空的(通过下载应用程序并提取 sqlite 文件并在我的 Mac 上打开它来确认),它从那时起就可以工作了。
在我的应用委托中,我执行以下操作
[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 上的最新版本。
【问题讨论】:
我有同样的问题 - 你解决了吗?我正在使用默认上下文.. 它只发生在 setupAutoMigratingCoreDataStack 中。不使用 setupCoreDataStackWithStoreNamed 是的,虽然我不记得我到底做了什么。我们已经使用 stackWithStoreNamed 转移到 MR3 和 ClassicWithBackgroundCoordinatorSQLiteMagicalRecordStack 【参考方案1】:您可能看不到更改,因为您使用的是 MR_contextForCurrentThread。自从引入 GCD 队列以来,这种方法存在根本缺陷,并且已被弃用。我在my blog 上完成了这个。
当您使用 MR_createEntity 时,未指定 NSManagedObjectContext,您需要保存默认上下文,因为这是您所有数据所在的位置:
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
您的清理解决方法是不必要的,而且很可能会丢失数据。
【讨论】:
根据您的 github 问题论坛中的其他内容,我不再使用MR_contextForCurrentThread
内容,但没有它我还没有测试过这个问题。让我测试一下,我会回来报告的。我怀疑你是 100% 正确的。 Merci、Gracias 和 Danke
这让我免于头痛。多谢!遗憾的是,MR 的文档记录相当差。【参考方案2】:
我做了一个解决方法
[MagicalRecord setupAutoMigratingCoreDataStack];
[MagicalRecord cleanUp];
[MagicalRecord setupAutoMigratingCoreDataStack];
在我的应用委托中。这样做即使在应用程序的第一次运行时也能正常工作——保存实际上存储在数据库中......
【讨论】:
以上是关于MagicalRecord 保存在应用程序第一次退出并重新运行之前不会持续存在的主要内容,如果未能解决你的问题,请参考以下文章
MagicalRecord 3.0 不保存。第二次构建没有对象