我不确定这是核心数据问题还是MagicalRecord问题。
我的应用使用MagicalRecord来帮助使用CoreData。当应用程序在安装后第一次运行时,当我保存新对象,然后应用程序退出并再次运行时,这些对象不在那里。但是,在第一次重新运行应用程序后创建的任何新对象都会正常保留。它仅在应用程序新鲜且数据库为空时才会发生。当应用程序运行一次时,即使数据库为空(通过下载应用程序并解压缩sqlite文件并在我的Mac上打开它来确认),它从那时开始工作。
在我的app委托中,我执行以下操作
[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上的最新版本。
答案 0 :(得分:3)
您可能没有看到更改,因为您正在使用MR_contextForCurrentThread。自从引入GCD队列以来,这种方法存在根本缺陷,并且已被弃用。我在my blog上完成了这个。
使用MR_createEntity时,如果不指定NSManagedObjectContext,则需要保存默认上下文,因为这是您所有数据的所在位置:
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
您的清理解决方法是不必要的,很可能是丢失数据。
答案 1 :(得分:0)
我做的工作
[MagicalRecord setupAutoMigratingCoreDataStack];
[MagicalRecord cleanUp];
[MagicalRecord setupAutoMigratingCoreDataStack];
在我的app委托中。这样做甚至可以在应用程序的第一次运行时运行 - 保存实际上存储在db ...
中