Magical Record级联删除(全部截断)不删除

Posted

技术标签:

【中文标题】Magical Record级联删除(全部截断)不删除【英文标题】:Magical Record cascade delete (truncateAll) not deleting 【发布时间】:2013-07-25 09:17:44 【问题描述】:

我在我的应用中使用 Magical Record。

我有关系...

Competition <-->> League

即一个Competition 可以有多个Leagues。一个League 只能有一个Competition

Competition to League 的删除规则设置为 Cascade。反向删除规则设置为Nullify

如果我删除Competition,那么我期望发生的情况是,属于它的所有Leagues 也会被删除。 (我在以前的应用程序中成功使用过这个)。

我正在测试...

    下载并插入所有比赛和联赛。

    用比赛名称记录所有联赛。

    NSArray *leagues = [League findAll];
    for (League *league in *leagues)
    
        NSLog(@"%@ - %@", league.name, league.competition.name);
    
    
    e.g. Man UTD - Premier League
    

    运行以下代码...

    [Competition truncateAll];
    

    用比赛名称记录所有联赛。

    e.g. Man UTD - (null)
    

我希望这会删除 LeaguesCompetitions

我的假设是否正确?为什么不做呢?

【问题讨论】:

你如何“用比赛名称记录所有联赛”?您是再次获取它们还是使用指向对象的现有指针? - 请注意,删除规则仅在您 save 上下文或调用 processPendingChanges 时应用。 已编辑以显示日志代码。我以为 truncateAll 做到了?我是愚蠢的。我将截断包裹在一个保存块中,它起作用了。谢谢:) 【参考方案1】:

当被管理对象时应用关系删除规则 上下文被保存,或者processPendingChanges被调用。

在implementation 中可以看到,MagicalRecord 方法MR_truncateAll 调用 deleteObject 在实体的所有对象上,但不保存上下文。

【讨论】:

是否也删除了数据库? @user1007522:不,它会删除给定实体的所有对象,例如[Car truncateAll]; 从数据库中删除所有 Car 对象。可能存在其他不受影响的实体。 SQLite 文件本身不会被删除。 @MartinR,好吧,我怎样才能删除整个数据库内容? @gaussblurinc 您找到删除整个数据库的解决方案了吗? [magicalrecord cleanup] 有效吗? @ZigiiWong no, [MagicalRecord CleanUp] 用协调器、存储、上下文清理神奇的记录堆栈。您可以通过擦除所有表中的所有内容或擦除数据库文件(如果您使用 sqlite )来清理数据库。看看gist【参考方案2】:

我同意 Martin R.

只需在

之后添加以下行
[Competition truncateAll];

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

你会很高兴的! :)

【讨论】:

以上是关于Magical Record级联删除(全部截断)不删除的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record 删除所有记录 Swift

Magical Record,CoreData,删除一条记录并重新编号

如何使用 Magical Record 从特定上下文中简单地删除一组实体?

Magical Record 自定义核心数据迁移不提取现有数据

Magical Record、多种配置和 Restkit

Magical Record 手动丢弃对尚未保存到数据库的所有实体的所有更改