iOS MagicalRecord 之谜。为啥在 truncateAll 后重新启动时我的数据会重新出现?

Posted

技术标签:

【中文标题】iOS MagicalRecord 之谜。为啥在 truncateAll 后重新启动时我的数据会重新出现?【英文标题】:iOS MagicalRecord mystery. Why does my data reappear on restart after truncateAll?iOS MagicalRecord 之谜。为什么在 truncateAll 后重新启动时我的数据会重新出现? 【发布时间】:2014-01-13 19:52:04 【问题描述】:

我有一个通过 MagicalRecord 使用 Core Data 的小型应用程序,目的是学习如何按类别对活动进行分组并在分组的表格视图中显示数据。因此,我有两个实体,这里只使用其中一个。它叫做 ListActivity,有两个属性,“name”和“category”,都是字符串。

撇开我在理解 MR 中提供的各种分组和排序方法的工作原理方面的困难不谈,我添加了一个“TruncateAll”按钮来简单地清除石板,这样我就可以重新输入数据。

这是该按钮的 IBAction 方法:

- (IBAction)dumpMemory:(UIButton *)sender

    [ListActivity MR_truncateAll];
    [self refreshData];

这是一个奇怪的事情:按钮操作将 tableview(可能还有商店)擦干净,正如预期的那样。

但是,如果我通过 Xcode 中的“停止”按钮终止 sim,然后重新启动它,所有数据都会重新出现在 tableview 中。这里有几个截图来说明:

输入数据后:

点击 TruncateAll 按钮后:

杀死后重启,数据又神秘出现:

但是,如果我杀死 sim 中的应用程序:

当它重新启动时,状态是干净的:

有 MagicalRecord 经验的人可以告诉我我缺少什么吗?

谢谢!

编辑:

好的,感谢所有回答的人!每个人都立即看到了我的错误。我像这样修改了 IBAction 方法:

- (IBAction)dumpMemory:(UIButton *)sender

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [ListActivity MR_truncateAllInContext:localContext];
    [localContext MR_saveToPersistentStoreAndWait];

    [self refreshData];

现在一切正常!

非常感谢!

【问题讨论】:

你什么时候保存(调用 MR_save 的一些变体)? 【参考方案1】:

这种情况在MagicalRecord 开发中很常见。通过主教程,MagicalRecord 仅在应用程序进入后台时保存上下文。因此,如果您在 Application Delegate 中调用 applicationDidEnterBackground 方法之前终止应用程序,则截断将不会被保存。

当您从模拟器中删除应用程序时,所有应用程序数据都会被删除。

要解决这个问题,请确保在适当的地方调用MagicalRecordsave方法,如果你只是测试,可以在Truncate All按钮的IBAction中。

【讨论】:

只是为了完成,保存到后台永久存储通常是要走的路。 ;)【参考方案2】:

您可能忘记保存托管对象上下文,以便更改 不会在应用程序重新启动后持续存在。

【讨论】:

以上是关于iOS MagicalRecord 之谜。为啥在 truncateAll 后重新启动时我的数据会重新出现?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的对象更新为 MagicalRecord 持久存储执行了两次?

MagicalRecord 在 ios8 上崩溃

MagicalRecord 在 ios 8.1 的第一次运行时崩溃

iOS MagicalRecord 启动时崩溃

NFS未解之谜之IO持续占用问题

带有核心数据/MagicalRecord 意外行为的 iOS 单元测试