如何在类“子属性”上设置Realm primaryKey

时间:2018-09-26 08:02:20

标签: ios swift 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
    ...
}

我需要将Dog的标识符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 :(得分:0)

  

如何告诉Realm为对象寻找对象的sub属性   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

这得出一个结论,即主键必须为StringInt类型,并且它必须是Dog的属性,而不是另一个类。

答案 1 :(得分:0)

我从未在Realm中尝试过此操作,但是可能可以使用动态变量作为主键以及从子对象中提取值的函数:

var _identifier: Identifier

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

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

func identifierValue() -> String {
    return _identifier.functionalId
}