Изначально у меня были следующие классы:
@objcMembers public class NormalObjectRealm: Object {
// Shared
dynamic public var id: String?
dynamic public var title: String?
dynamic public var subTitle: String?
dynamic public var imageInfo: ImageInfoRealm?
dynamic public var descriptionString: String?
public var categories = List<String>()
public var count = RealmOptional<Int>()
public var episodes = List<String>()
public static let realmPrimaryKey: String = "id"
public override class func primaryKey() -> String? {
return NormalObjectRealm.realmPrimaryKey
}
}
@objcMembers public class ImageInfoRealm: Object {
dynamic public var id: String?
dynamic public var url: String?
public static let realmPrimaryKey: String = "id"
public override class func primaryKey() -> String? {
return ImageInfoRealm.realmPrimaryKey
}
}
, но теперь NormalObjectRealm
вроде как включено в новый класс, например:
@objcMembers public class MediaObjectRealm: Object {
// Shared
dynamic public var id: String?
dynamic public var title: String?
dynamic public var subTitle: String?
dynamic public var imageInfo: ImageInfoRealm?
dynamic public var descriptionString: String?
public var categories = List<String>()
dynamic public var type: String?
// NormalObjectRealm
public var episodeCount = RealmOptional<Int>()
public var episodes = List<String>()
// OtherObjectRealm
dynamic public var urlOne: String?
dynamic public var urlTwo: String?
dynamic public var urlThree: String?
public var isExplicit = RealmOptional<Bool>()
public static let realmPrimaryKey: String = "id"
public override class func primaryKey() -> String? {
return MediaObjectRealm.realmPrimaryKey
}
}
Я сейчас пытаюсьнапишите миграцию для перехода здесь, где идея в основном состоит в том, чтобы перенести большинство полей из NormalObjectRealm
в MediaObjectRealm
.
Вот как мой блок миграции выглядит в настоящее время
Realm.Configuration(schemaVersion: schemaVersion, migrationBlock: { migration, oldSchemaVersion in
if oldSchemaVersion < temp {
print("RealmMigration: Applying migration from \(oldSchemaVersion) to \(temp)")
migration.enumerateObjects(ofType: "NormalObjectRealm") { oldObject, newObject in
guard let oldObject = oldObject else {
return
}
guard let id = oldObject["id"] as? String else {
return
}
guard let title = oldObject["title"] as? String else {
return
}
guard let subTitle = oldObject["subTitle"] as? String else {
return
}
guard let imgInfo = oldObject["imageInfo"] else {
return
}
guard let count = oldObject["count"] as? RealmOptional<Int>? else {
return
}
guard let descriptionString = oldObject["descriptionString"] as? String? else {
return
}
let item = migration.create("MediaObjectRealm")
item["id"] = id
item["title"] = title
item["subTitle"] = subTitle
item["descriptionString"] = descriptionString
item["type"] = "myType"
item["episodeCount"] = episodeCount // Doesn't work either...
migration.enumerateObjects(ofType: "ImageInfoRealm") { oldImg, newImg in
guard let oldImg = oldImg else {
return
}
let inf = oldObject.value(forKey: "imageInfo")
print(inf)
let t = migration.create("ImageInfoRealm", value: inf)
print("doing it")
// print(t)
item.setValue(t, forKey: "imageInfo")
}
}
}
})
id
, title
, subTitle
и т. Д. (String?
и Date?
переменные) устанавливаются в порядке и появляются во вновь созданных MediaObjectRealm
записях DB.Однако imageInfo
типа ImageInfoRealm
не ... устанавливает его прямо так: item.setValue(oldObject.value(forKey: "imageInfo"), forKey: "imageInfo")
(или item["imageInfo"] = oldObject.value(forKey: "imageInfo")
) приводит к краху области и говорит мне, что этот объект из другой области, и я должен скопировать его.
'Объект уже управляется другим Царством.Вместо этого используйте команду create, чтобы скопировать ее в эту область. '
Создание ее, как в приведенном выше коде, приводит к тому, что вообще отсутствуют элементы типа MediaObjectRealm
, т. Е. Теряются все данные (как * 1032).* тоже больше нет).Я что-то пропустил?В основном я хочу взять ссылку / ссылку из NormalObjectRealm
и скопировать ее в новый MediaObjectRealm
.