如何使用 RKObjectMapping 在嵌套的 RLMObject 中设置相同的主键?

Posted

技术标签:

【中文标题】如何使用 RKObjectMapping 在嵌套的 RLMObject 中设置相同的主键?【英文标题】:How can I set same primary key in nested RLMObject with RKObjectMapping? 【发布时间】:2015-10-07 11:48:10 【问题描述】:

我想在嵌套的 RLMObject 中设置相同的主键。 如何使用 RKObjectMapping 设置相同的 id?

首先,我制作了以下 json 文件。 JSON文件


  "id": 1
  "obj2": 
    "name": "name1"  
   

其次,我制作了以下 swift 类文件。 类文件

class Obj2: RLMObject 
    dynamic var id: Int <-- I want to set same id as Obj1.id
    dynamic var name: String!

    override class func primaryKey() -> String 
        return "id"
    

    class func responseMapping() -> RKObjectMapping 
        let objectMapping = RKObjectMapping(forClass: self)
        objectMapping.addAttributeMappingsFromDictionary([
            "name": "name"
        return objectMapping
    


class Obj1: RLMObject 
    dynamic var id: Int!
    dynamic var obj2: Obj2?

    override class func primaryKey() -> String 
        return "id"
    

    class func responseMapping() -> RKObjectMapping 
        let objectMapping = RKObjectMapping(forClass: self)
        objectMapping.addAttributeMappingsFromDictionary([
            "id": "id"

        objectMapping.addPropertyMappingsFromArray([
            RKRelationshipMapping(fromKeyPath: "obj2", toKeyPath: "obj2", withMapping: Obj2.responseMapping())
        ])

        return objectMapping
    

【问题讨论】:

【参考方案1】:

您需要在同一个 JSON 基础对象上设置映射,而不是遍历范围,这会使映射依赖于关系。

class Obj2: RLMObject 
    dynamic var id: Int
    dynamic var name: String!

    override class func primaryKey() -> String 
        return "id"
    

    class func responseMappingForBeingOwnedByObj1() -> RKObjectMapping 
        let objectMapping = RKObjectMapping(forClass: self)
        objectMapping.addAttributeMappingsFromDictionary([
            "id": "id",
            "name": "obj2.name"
        ])
        return objectMapping
    


class Obj1: RLMObject 
    dynamic var id: Int!
    dynamic var obj2: Obj2?

    override class func primaryKey() -> String 
        return "id"
    

    class func responseMapping() -> RKObjectMapping 
        let objectMapping = RKObjectMapping(forClass: self)
        objectMapping.addAttributeMappingsFromDictionary([
            "id": "id"
        ])

        objectMapping.addPropertyMappingsFromArray([
            RKRelationshipMapping(fromKeyPath: ".", toKeyPath: "obj2", withMapping: Obj2.responseMappingForBeingOwnedByObj1())
        ])

        return objectMapping
    

最后一句警告:RestKit 目前并不真正支持 Realm。因此,您现在可能最好使用其他东西,例如Realm 对解码对象表示的有限内置支持,Realm+JSON 或 Decodable。

【讨论】:

以上是关于如何使用 RKObjectMapping 在嵌套的 RLMObject 中设置相同的主键?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RKObjectMapping 的嵌套映射

RestKit RKObjectMapping .. 嵌套和一次性对象

使用 RKObjectMapping 进行递归映射?

RestKit/RKObjectMapping:从服务器加载数据后如何添加其他属性?

如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?

我可以混合使用 RKEntityMapping 和 RKObjectMapping