首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心数据迁移删除实体数据

核心数据迁移删除实体数据
EN

Stack Overflow用户
提问于 2015-10-09 11:50:44
回答 4查看 3.3K关注 0票数 8

我想在核心数据中进行轻量级迁移。我正在向一个运行良好的实体添加一个属性。

但是在这个特定的迁移之后,我希望删除该实体的数据(该实体的表中包含的所有对象)。

我通过了这个question,但这个方法看起来不太好,因为我想将将来需要的每个迁移的逻辑分开。

我考虑了一种方法,直接重命名该实体,但不指定rename Identifier,以便核心数据将其处理为删除实体和添加新实体,但这不会成为未来迁移中所有类似情况的永久解决方案。

有没有办法可以通过xcdatamodeld的UI直接删除数据,或者有没有其他方法?

EN

回答 4

Stack Overflow用户

发布于 2019-06-12 10:08:27

在找到一种方法后,我能够做到这一点,通过映射模型使用自定义EntityMigrationPolicy,为实体映射设置自定义策略,例如。此策略(ProductName.DeleteEntityPolicy)的EntityNameToEntityName

代码语言:javascript
复制
// Swift 5
class DeleteEntityPolicy: NSEntityMigrationPolicy {
    override func begin(_ mapping: NSEntityMapping, with manager: NSMigrationManager) throws {
        // Get all current entities and delete them before mapping begins
        let entityName = "EntityName"
        let request = NSFetchRequest<NSManagedObject>(entityName: entityName)
        let context = manager.sourceContext
        let results = try context.fetch(request)
        results.forEach(context.delete)
        try super.begin(mapping, with: manager)
    }
}

有关使用映射模型设置自定义迁移的方法的更多信息:https://stackoverflow.com/a/40662940

我很想知道是否有更好的方法/内置的方法来做到这一点。

票数 6
EN

Stack Overflow用户

发布于 2015-10-10 00:29:15

您可以使用映射模型来实现这一点。要创建映射模型,请执行以下步骤:

在XCode中选择新建文件

为您的新文件选择模板:在左侧窗格中选择核心数据,在右侧窗格中选择映射模型,然后单击下一步

映射模型源数据模型:选择您的旧数据模型并单击Next

映射模型目标数据模型:选择您的新数据模型并单击Next

另存为:您可能知道这是如何工作的

在您的映射模型中,您会在左侧看到一个名为“实体映射”的面板。选择不想迁移的实体的enity映射,然后键入退格键将其删除。

要使用映射模型自动迁移,您必须使用NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption选项配置持久存储协调器。

票数 2
EN

Stack Overflow用户

发布于 2015-10-10 07:04:30

在不修改自动迁移的情况下,简单的“轻量级”解决方案是简单地确定是否发生了迁移(例如,通过NSUserDefaults版本字符串),然后删除所有您想要删除的实体。

如果没有关系,可以考虑NSBatchDeleteRequest,它非常有效。然而,在迁移后第一次启动应用程序后,通过对象图进行删除也是可行的:获取实体的所有实例并循环结果以删除每个实例,在结束时或成批保存。

如果您需要有关性能的建议,请在评论中回复我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33029619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档