我正面临为大型且长期运行的应用程序迁移 Realm 支持的对象。该对象在其生命周期中经历了多次属性迁移,最近已从应用程序中完全删除。
由于 Realm 迁移以从最旧模式版本到最新模式版本的线性方法发生,我了解来自多个版本的旧应用程序的用户将在到达最新版本之前一个接一个地迁移所有版本。这在过去从未出现过问题,我只是想知道现在该对象将不再存在于最新版本中时需要什么方法,因此无法找到以前的迁移类引用。
一个简化的例子。
V1 架构
class Customer: Object {
@objc dynamic var customerId: String?
@objc dynamic var surname: String?
@objc dynamic var givenName: String?
}
V5 架构
class Customer: Object {
@objc dynamic var customerId: String?
@objc dynamic var surname: String?
@objc dynamic var givenName: String?
@objc dynamic var fullName: String?
}
V16 架构
class Customer: Object {
@objc dynamic var customerId: String?
@objc dynamic var surname: String?
@objc dynamic var givenName: String?
@objc dynamic var fullName: String?
@objc dynamic var lastVisited: Date?
}
V20 架构
//Customer object does not exist anymore
通过架构版本迁移的示例
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 5) {
migration.enumerateObjects(ofType: Customer.className()) { oldObject, newObject in
let givenName = oldObject!["givenName"] as! String
let surname = oldObject!["surname"] as! String
newObject!["fullName"] = "\(givenName) \(surname)"
}
}
if (oldSchemaVersion < 16) {
migration.enumerateObjects(ofType: Customer.className()) { oldObject, newObject in
if let newObject = newObject {
newObject["lastVisited"] = Date()
}
}
}
if (oldSchemaVersion < 20) {
//I want to delete all Customer data for an object that no longer exists
}
}
我现在的问题是:
迁移行上将存在构建错误,而
enumerateObjects(ofType: Customer.className())
asCustomer
不再存在。在 v5 和 v16 中迁移的属性以及所有其他
Customer
属性不再存在。这有关系吗?我想删除 v20 中的所有数据并删除该
Customer
对象。
我的想法:
- 我是否要返回并修改以前的迁移以使用字符串名称而不是 className?例如。
enumerateObjects(ofType: "Customer")
- 鉴于我不再关心早期迁移中的客户属性,并且任何用户更新都将在 V20 上结束,所以最终迁移非常简单:
migration.deleteData(forType: "Customer").
- 从 v5 -> v20 迁移的用户会有什么体验?