在迁移过程中删除 属性
Remove property during migration
我查看了 Realm 站点上的文档,但找不到任何描述如何在迁移中删除 属性 的内容。我采用了一组彼此足够相似的属性并将它们移动到一个新对象中。类似于:
class MyObject: Object {
@objc dynamic var siteName = ""
@objc dynamic var lat = 0.0
@objc dynamic var lon = 0.0
@objc dynamic var roadNames = ""
@objc dynamic var startTime = ""
@objc dynamic var endTime = ""
@objc dynamic var comments: String = ""
@objc dynamic var complete: Bool = false
}
然后我将其更改为:
class Site: Object {
@objc dynamic var siteName = ""
@objc dynamic var lat = 0.0
@objc dynamic var lon = 0.0
@objc dynamic var roadNames = ""
}
class MyObject: Object {
@objc dynamic var site: Site?
@objc dynamic var startTime = ""
@objc dynamic var endTime = ""
@objc dynamic var comments: String = ""
@objc dynamic var complete: Bool = false
}
而我的迁移是
let block: MigrationBlock = { (migration: Migration, oldSchemaVersion) in
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
newObject!["siteName"] = oldObject!["siteName"]
newObject!["lat"] = oldObject!["lat"]
newObject!["lon"] = oldObject!["lon"]
newObject!["roadNames"] = oldObject!["roadNames"]
// Delete old properties.
}
}
}
我的迁移应该如何删除属性?
如果阅读 Realm guide on migrations,您会在其中一个代码块的注释中看到:
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
因此您无需担心删除属性,因为它们会自动删除。
不过,您需要担心的是如何迁移其他值。您应该为每个 MyObject
创建一个 Site
并为该 Site
分配属性,我看不到您在这里这样做。有关如何在迁移块中创建新的 Site
,请参阅 。
您的迁移块应该类似于:
migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
let site = migration.create(Site.className())
site["siteName"] = oldObject!["siteName"]
site["lat"] = oldObject!["lat"]
site["lon"] = oldObject!["lon"]
site["roadNames"] = oldObject!["roadNames"]
newObject!["site"] = site
}
我查看了 Realm 站点上的文档,但找不到任何描述如何在迁移中删除 属性 的内容。我采用了一组彼此足够相似的属性并将它们移动到一个新对象中。类似于:
class MyObject: Object {
@objc dynamic var siteName = ""
@objc dynamic var lat = 0.0
@objc dynamic var lon = 0.0
@objc dynamic var roadNames = ""
@objc dynamic var startTime = ""
@objc dynamic var endTime = ""
@objc dynamic var comments: String = ""
@objc dynamic var complete: Bool = false
}
然后我将其更改为:
class Site: Object {
@objc dynamic var siteName = ""
@objc dynamic var lat = 0.0
@objc dynamic var lon = 0.0
@objc dynamic var roadNames = ""
}
class MyObject: Object {
@objc dynamic var site: Site?
@objc dynamic var startTime = ""
@objc dynamic var endTime = ""
@objc dynamic var comments: String = ""
@objc dynamic var complete: Bool = false
}
而我的迁移是
let block: MigrationBlock = { (migration: Migration, oldSchemaVersion) in
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
newObject!["siteName"] = oldObject!["siteName"]
newObject!["lat"] = oldObject!["lat"]
newObject!["lon"] = oldObject!["lon"]
newObject!["roadNames"] = oldObject!["roadNames"]
// Delete old properties.
}
}
}
我的迁移应该如何删除属性?
如果阅读 Realm guide on migrations,您会在其中一个代码块的注释中看到:
// Nothing to do! // Realm will automatically detect new properties and removed properties // And will update the schema on disk automatically
因此您无需担心删除属性,因为它们会自动删除。
不过,您需要担心的是如何迁移其他值。您应该为每个 MyObject
创建一个 Site
并为该 Site
分配属性,我看不到您在这里这样做。有关如何在迁移块中创建新的 Site
,请参阅
您的迁移块应该类似于:
migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
let site = migration.create(Site.className())
site["siteName"] = oldObject!["siteName"]
site["lat"] = oldObject!["lat"]
site["lon"] = oldObject!["lon"]
site["roadNames"] = oldObject!["roadNames"]
newObject!["site"] = site
}