停止删除特定的 CoreData 记录?

Posted

技术标签:

【中文标题】停止删除特定的 CoreData 记录?【英文标题】:Stop Specific CoreData Record Being Deleted? 【发布时间】:2012-01-19 12:54:36 【问题描述】:

我在我的应用程序中设置了 CoreData,并且我有一个属性为“isSpecial”布尔值的实体。对于“isSpecial”为真的记录,我希望这些记录不能被用户从它所显示的 UITableView 中删除。

那么我该怎么做呢?如何直接看到用户“isSpecial”选择的单元格?

谢谢,非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

假设您在表格视图上使用滑动删除,最好使用tableView:canEditRowAtIndexPath: 并且仅在isSpecial 为假时才允许编辑。这将阻止用户点击删除按钮并且没有任何事情发生

【讨论】:

我已经尝试过了,但是如何访问附加到该单元格的对象的 isSpecial 属性? 与在 tableView:cellForRowAtIndexPath: 中设置单元格数据时访问它的方式相同。假设你有一个 NSFetchedResultsController 它会像 MyEntity *cellEntity = [self.fetchedResultsController objectForRowAtIndexPath:indexPath]; return ![cellEntity.isSpecial boolValue]; 哦,当然,我很傻。我可以做[self.fetchedResultsController objectAtIndexPath:indexPath],但不能做objectForRowAtIndexPath。这应该有所作为吗?但是我对此没有任何运气。我知道它可能是什么,但在我说任何可能会影响你的想法之前,有什么想法吗? 对不起,我只是凭记忆输入的,你应该使用objectAtIndexPath: 嗯,好的。我在想,我在索引 0 处有一个自定义单元格,这意味着每当访问表中的核心数据对象时我都必须调整索引路径,但使用这个:NSIndexPath *path = [NSIndexPath indexPathForRow:(indexPath.row - 1) inSection:indexPath.section];。这会将索引减去一个,这在我的所有其他 tableview 委托方法中对我来说非常有效,但是这一次它并没有阻止我获取超出范围错误的索引并导致应用程序崩溃。【参考方案2】:

您可以为您的实体子类化NSManagedObject(如果您还没有),并覆盖validateForDelete: 以检查对象的isSpecial 属性。

你还应该调用 super 的实现,as detailed here。

如果您想以编程方式删除它,您只需在尝试删除之前将isSpecial 设置为NO

【讨论】:

这可能会阻止实际数据被删除,但单元格仍然可以从表格视图中删除。 我没想到! @wattson12 的答案是接下来要走的路。

以上是关于停止删除特定的 CoreData 记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Core Data 中删除具有特定属性的项目?

从 Core Data 中删除记录

如果 indexPath 已知,则从 Core Data 中删除条目

RestKit / Core Data:远程删除的实体不会从 Core Data 中删除

点击按钮时停止在后台保存到 coredata

使来自Core Data中API的本地缓存数据无效