Core Data删除旧实体是否会影响TestFlight用户的已存储数据?
Core Data实体修改:别直接删!这样保数据
兄弟,直接删除旧实体再创建新实体的话,现有TestFlight用户存在该实体里的所有数据都会彻底丢失,而且大概率还会导致应用启动崩溃——这绝对是要避免的致命操作,毕竟你的应用已经有真实用户在使用了。
下面给你说安全修改实体属性、保住用户数据的正确姿势:
优先用轻量级迁移(简单修改首选)
如果只是调整属性(比如加新属性、删旧属性、修改属性类型但兼容、重命名属性/实体),Core Data的轻量级迁移能自动搞定,步骤超简单:- 右键你的
xcdatamodeld文件,选「Add Model Version」创建新的模型版本 - 在新版本里修改实体属性(别碰旧模型版本!)
- 选中
xcdatamodeld文件,在右侧属性面板里把「Current Model Version」改成你刚创建的新版本 - 初始化Core Data栈时,加上自动迁移的配置:
let persistentContainer = NSPersistentContainer(name: "YourModelName") guard let storeDescription = persistentContainer.persistentStoreDescriptions.first else { fatalError("Failed to get store description") } // 开启自动迁移和自动映射推断 storeDescription.setOption(true as NSNumber, forKey: NSMigratePersistentStoresAutomaticallyOption) storeDescription.setOption(true as NSNumber, forKey: NSInferMappingModelAutomaticallyOption) persistentContainer.loadPersistentStores(completionHandler: { (_, error) in if let error = error as NSError? { fatalError("Core Data load failed: \(error), \(error.userInfo)") } })
这样Core Data会自动把旧实体的数据迁移到新结构里,不用你写额外的转换代码。
- 右键你的
复杂修改用手动映射迁移
如果你的实体结构改得特别大(比如要把旧实体的字段拆分到新实体,或者需要自定义数据转换逻辑),就得手动搞映射模型:- 同样先创建模型新版本,调整好新实体的结构
- 新建「Mapping Model」(File → New → Core Data → Mapping Model),选旧模型当源、新模型当目标
- 在映射模型里配置实体和属性的对应关系,要是需要特殊转换,还可以写
NSEntityMigrationPolicy的子类,自定义数据迁移逻辑 - 同样在初始化Core Data栈时开启自动迁移选项,Core Data会用你定义的映射模型来完成迁移
重点提醒:绝对不能直接删旧实体
直接删旧实体的话,现有用户的本地存储文件里还留着旧实体的数据,Core Data启动时发现模型不匹配,要么直接崩溃,要么清空旧数据——两种情况都会让用户炸毛,绝对不能这么干!
总之,不管你是微调属性还是重构实体,都得靠模型版本化+迁移这套流程来操作,才能保住用户的数据,同时完成你的实体修改需求。
内容的提问来源于stack exchange,提问作者D-A UK
相关产品推荐
相关产品推荐

