【问题标题】:Core data join table records not deleted in many-to-many relationship多对多关系中未删除的核心数据连接表记录
【发布时间】:2015-12-07 16:03:37
【问题描述】:

我在处理双方删除规则都设置为 Nullify 的核心数据多对多关系时遇到问题。当我检查 SQL 数据库时,我发现连接表中留下了应该删除的记录。

这两个表代表播放列表和曲目。播放列表删除不会级联自动删除每个曲目,因为每个曲目可以位于多个播放列表中。

播放列表中的曲目是有序关系。

曲目正在从播放列表中删除,播放列表和曲目分别被删除,但在数据库的 Z_6PLAYLIST_TRACKS 表中仍有一条记录。

如何确保这些记录也被删除?

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    很可能完全删除没有传播到 sqlite 文件中,并且仍然位于两个缓存文件之一中。现在这很常见,因为 Core Data 正在将 sqlite 与 WAL 模式一起使用。

    顺便说一句,我不会担心 Core Data 内部的表格。仅通过公共 API 访问核心数据。 SQLite 文件的内部工作不应该尝试保持同步。

    如果您获得了您期望获得的数据并且您的删除为您提供了您期望的结果,那么这就足够了。只有当您遇到删除问题时,您才应该处理 SQLite 文件的内部结构。

    更新 1

    感谢测试用例,这是 Core Data 中的一个实际问题。那里没有你做错的事情。您真的需要为此提交一份雷达,我也会提交一份。

    在此期间,您可以停止使用有序关系(无论如何它们都是混蛋)或进行双重删除。

    就我个人而言,我会从有序关系中更改它,因为它们的性能很糟糕并且显然存在问题。

    【讨论】:

    • 感谢您的回复马库斯。 Z_6PLAYLIST_TRACKS 中的记录肯定会保留,不会被删除。一个积累了大型数据库的用户注意到了这个问题,并且留下了数千条这样的记录。我尝试禁用 WAL 模式,但问题仍然存在。我创建了一个测试项目,发现如果我链接播放列表和曲目,然后在播放列表上调用 deleteObject: 并跟踪关系记录保留在数据库中,则出现相同的问题。
    • 我注意到如果你删除关系,即使用 removePlaylistTracksObject:,然后保存,然后删除播放列表和曲目,然后保存,它就可以工作。我希望在删除播放列表或曲目以及单个保存时删除关系记录。此外,如果未对曲目的播放列表进行排序,则它可以正常工作。我认为这突出了这个问题。 Apple 的有序关系实现有一个已知错误 (stackoverflow.com/questions/7385439/…),我不得不覆盖默认处理。
    • 我之前以为这无关,但也许不是。
    • 啊,我错过了问题的有序关系部分。这使得它成为 API 中的一个问题更加重要。既然你有一个测试用例,你能把它贴在这里和/或就这个问题提交一个雷达吗?
    • 用户从这个问题中看到了什么效果?
    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 2012-02-17
    • 2016-08-12
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多