我想在核心数据中进行轻量级迁移。我正在向一个运行良好的实体添加一个属性。
但是在这个特定的迁移之后,我希望删除该实体的数据(该实体的表中包含的所有对象)。
我通过了这个question,但这个方法看起来不太好,因为我想将将来需要的每个迁移的逻辑分开。
我考虑了一种方法,直接重命名该实体,但不指定rename Identifier,以便核心数据将其处理为删除实体和添加新实体,但这不会成为未来迁移中所有类似情况的永久解决方案。
有没有办法可以通过xcdatamodeld的UI直接删除数据,或者有没有其他方法?
发布于 2019-06-12 10:08:27
在找到一种方法后,我能够做到这一点,通过映射模型使用自定义EntityMigrationPolicy,为实体映射设置自定义策略,例如。此策略(ProductName.DeleteEntityPolicy)的EntityNameToEntityName:
// 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
我很想知道是否有更好的方法/内置的方法来做到这一点。
发布于 2015-10-10 00:29:15
您可以使用映射模型来实现这一点。要创建映射模型,请执行以下步骤:
在XCode中选择新建文件
为您的新文件选择模板:在左侧窗格中选择核心数据,在右侧窗格中选择映射模型,然后单击下一步
映射模型源数据模型:选择您的旧数据模型并单击Next
映射模型目标数据模型:选择您的新数据模型并单击Next
另存为:您可能知道这是如何工作的
在您的映射模型中,您会在左侧看到一个名为“实体映射”的面板。选择不想迁移的实体的enity映射,然后键入退格键将其删除。
要使用映射模型自动迁移,您必须使用NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption选项配置持久存储协调器。
发布于 2015-10-10 07:04:30
在不修改自动迁移的情况下,简单的“轻量级”解决方案是简单地确定是否发生了迁移(例如,通过NSUserDefaults版本字符串),然后删除所有您想要删除的实体。
如果没有关系,可以考虑NSBatchDeleteRequest,它非常有效。然而,在迁移后第一次启动应用程序后,通过对象图进行删除也是可行的:获取实体的所有实例并循环结果以删除每个实例,在结束时或成批保存。
如果您需要有关性能的建议,请在评论中回复我。
https://stackoverflow.com/questions/33029619
复制相似问题