Как установить Realm primaryKey для класса «подсвойство» - PullRequest
0 голосов
/ 26 сентября 2018

Скажем, у меня есть класс и его представление Realm, которое выглядит следующим образом:

class Dog {
    var identifier: String
    var age: Int
    ...

    override static func primaryKey() -> String? {
        return "identifier"
    }
}

Теперь вот как выглядит мой новый класс Identifier:

class Identifier {
    var functionalId: String
    var version: String
    ...
}

Мне нужно заменитьСвойство String идентификатора моего Собака должно быть идентификатором, например:

class Dog {
    var identifier: Identifier
    var age: Int
    ...

    override static func primaryKey() -> String? {
        return "identifier" // I need to change this
    }
}

, но мне трудно заменить содержимое метода primaryKey ():

Как мне сообщить Realmискать подчиненное свойство объекта для primaryKey ()?

Я пробовал что-то вроде:

override static func primaryKey() -> String? {
    return "identifier.functionalId"
}

Но, похоже, я был слишком наивен, это не сработает

** РЕДАКТИРОВАТЬ ** Следуя комментариям, я получаю информацию о сбое:

Terminating app due to uncaught exception 'RLMException', reason: 'Primary key property 'identifier.functionalId' does not exist on object Dog

Извините за плохой английский, но я не смог найтиСлова для этой простой проблемы, особенно название!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я никогда не пробовал это в Realm, но это возможно при использовании динамической переменной для вашего первичного ключа и функции, которая извлекает значение из подобъекта:

var _identifier: Identifier

dynamic lazy var identifier: String = self.identifierValue()

override static func primaryKey() -> String? {
    return "identifier"
}

func identifierValue() -> String {
    return _identifier.functionalId
}
0 голосов
/ 26 сентября 2018

Как я могу сказать Realm искать подчиненное свойство объекта для primaryKey ()

Вы не можете.

Просмотр ошибокВы упомянули:

Если вы попытаетесь установить первичный ключ на:

override static func primaryKey() -> String? {
    return "identifier"
}

Тогда вы получите сообщение об ошибке из Realm: Property 'identifier' cannot be made the primary key of 'Dog' because it is not a 'string' or 'int' property.

Если вы попытаетесь установить первичный ключ на:

override static func primaryKey() -> String? {
    return "identifier.functionalId"
}

Затем вы получите сообщение об ошибке от Realm: Primary key property 'identifier.functionalId' does not exist on object Dog

Это приводит к выводу, что первичный ключ должен бытьтипа String или Int, и это должно быть свойство Dog, а не другого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...