ios - создание отношения в миграции Realm - PullRequest
0 голосов
/ 17 ноября 2018

Я борюсь с созданием миграции в Realm. В старой схеме я использую, чтобы такие классы были

class A: Object {
    @dynamic var identifier = 0
    @dynamic var bID = 0
}

class B: Object {
    @dynamic var identifier = 0
}

Прямо сейчас я бы хотел создать класс А, чтобы он выглядел так

class A: Object {
    @dynamic var identifier = 0
    @dynamic var b: B?
}

Но я не могу написать миграцию, которая бы работала.

ОБНОВЛЕНИЕ: я пытаюсь достичь чего-то вроде этого

migration.enumerateObjects(ofType: A.className(), { (old, new) in
    guard let bID = old?["bID"] as? Int else {
        new?["b"] = nil
        return
    }
    new?["b"] = (try! Realm()).object(ofType: B.self, forPrimaryKey: bID)
})

Надеюсь, теперь это немного яснее.

1 Ответ

0 голосов
/ 19 ноября 2018

Поскольку я обнаружил эту проблему с github - https://github.com/realm/realm-cocoa/issues/1385 Я полагаю, что сейчас это невозможно.

Таким образом, мое решение состояло в том, чтобы создать словарь миграции , который содержал информацию о том, какие отношения должны быть созданы после выполнения миграции, а затем сам создал отношения, вызвав realm.write { }.

Если исходное свойство bID не будет удалено, словарь не понадобится.

Это код, который я создал

var migrationDict = [Int: Int]()

let configuration = Realm.Configuration(schemaVersion: 2, migrationBlock: { (migration, oldVersion) in
    if oldVersion < 2 { 
        migration.enumerateObjects(ofType: A.className(), { (old, new) in
            if let bID = old?["bID"] as? Int, let id = old?["identifier"] as? Int {
                migrationDict[id] = bID
            }
        }
    }
})

Realm.Configuration.defaultConfiguration = configuration

let realm = try! Realm()
try! realm.write {
    migrationDict.forEach { aID, bID in
        // set the A.b relation here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...