CoreData SQLite - 数据看起来已删除,但实际上并没有
Posted
技术标签:
【中文标题】CoreData SQLite - 数据看起来已删除,但实际上并没有【英文标题】:CoreData SQLite - Data looks deleted but in fact, it is not 【发布时间】:2011-08-20 10:30:12 【问题描述】:该应用程序允许管理供应商列表和这些供应商提供的产品列表。数据模型包含 2 个实体:供应商和产品。
供应商与产品具有一对多关系,删除规则设置为级联(因为如果供应商停业,我不想保留供应商产品的记录)。产品具有默认关系设置。
在 IB 中,我有 2 个阵列控制器。指向供应商实体,参数:MOC 绑定到 AppDelegate 和 MKP=managedObjectContext。另一个指向 Product 实体,Parameters: MOC 绑定到 AppDelegate 和 MKP=managedObjectContext,Controller Content: Content Set 绑定到 Suppliers 数组控制器,CK=selection 和 MKP=name_of_relation。
在界面上,我有 2 个用于供应商和产品的 NSTableView,以及用于从表中添加/删除的按钮。当我选择一个供应商时,只有其特定的产品会显示在产品表中。当我删除一个产品时,该产品从表中消失。它按预期工作。
我认为它工作得很好,直到有一天我很想知道 CoreData 是如何实际管理 SQLite 数据库中的数据字段和表的。所以我使用 Firefox 中的 SQLiteManager 插件打开它,然后……太可怕了!我看到产品没有被删除。数据还在!只有对供应商的引用被删除了,这就是为什么它不再出现在表格中,让我认为它已被正确删除。
我做错了什么?它与内容集绑定有关吗? 感谢您的建议。
【问题讨论】:
【参考方案1】:我刚刚对此进行了测试,结果是关系实体已从 sqlite 数据库中完全删除。我认为您需要在 IB 中再次检查您的级联设置。你确定你有save:
声明吗?
【讨论】:
感谢您的回复。您是指应用程序的 save: 方法吗?是的,它在那里并且正在工作。例如,当我删除一个供应商时,它会适当地级联删除其所有相关产品。我使用 Firefox 检查,记录不再存在。我检查了数据模型中的设置,但有什么特别之处我应该在那里检查?没有那么多选择... 是的,我指的是[managedObjectContext save:&error]
方法。我知道模型编辑器很简单,只是觉得仔细检查一下很好。 - 很好,那么它正在工作!请考虑接受我的回答。
不,它不起作用 ;-) 当我删除供应商时,它的所有产品都会被删除。但是当我单独删除一个产品时,它并没有真正被删除。我的问题仍然存在。我做了第二个应用程序来测试它,认为第一个应用程序可能有问题但仍然有问题。我再次阅读了 Apple 关于绑定和核心数据的文档。真的看不出问题出在哪里,但这里肯定有我做错了......
刚刚在我的示例测试项目中检查了这一点。该行将从持久存储中删除。再次检查您是否save:
。
Mundi,抱歉我的反应迟了,我今天才注意到你的最后回复。我添加了一行代码来force 保存,但它仍然没有从数据库中删除记录。我再次检查了实体之间的数据模型关系,似乎没有任何问题。所以总结一下这个问题,这个问题只发生在父/子关系中的子数据上。以上是关于CoreData SQLite - 数据看起来已删除,但实际上并没有的主要内容,如果未能解决你的问题,请参考以下文章
NSBundle 中的 CoreData sqlite 文件
在 iOS 应用程序中处理数据(选择啥?NSData、CoreData、sqlite、PList、NSUserDefaults)