Миграция Swift Realm создает ссылку из старого типа в новый - PullRequest
0 голосов
/ 02 июля 2019

Изначально у меня были следующие классы:

@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.

...