如何使用 ObjectMapper 和 Realm 对象声明字典

Posted

技术标签:

【中文标题】如何使用 ObjectMapper 和 Realm 对象声明字典【英文标题】:How can I declare dictionary using both ObjectMapper and Realm object 【发布时间】:2017-01-10 05:54:27 【问题描述】:

我使用 ObjectMapper 进行 JSON 解析,使用 Realm 进行持久性,请帮助我如何声明一个字典,以便它与 Object Mapper 和 Realm 兼容。

 class UserInfo: Object,Mappable

var name:String?
var identifier:String?
var accountType:String?
var devices:[UserDevice]?
required init?(map: Map)




// Mappable
func mapping(map: Map)

    name <- map["username"]
    identifier <- map["identifier"]
    accountType <- map["accountType"]
    devices <- map["devices"]

===========

class UserDevice:Object,Mappable

var deviceName:String?
var deviceType:String?
var deviceIdentifier:String?

required init?(map: Map)




// Mappable
func mapping(map: Map) 
    deviceName <- map["name"]
    deviceType <- map["type"]
    deviceIdentifier <- map["identifier"]




 JSON :


 
username = santhosh;
"identifier" = "IDJSDJSJS";
configstatus = SET;
configtype = DEFAULT;
"data_center" = "evs.idrive.com";
devices = 
    "Ankita\LKKKK" = 
        identifier = LJJDFDD;
        name = "Ankita iPAD";
        type = iPad;
    ;
    "ARUN\LKKKHJH" = 
        identifier = LJJDFDFFD;
        name = "ARUN iPhone";
        type = ipHone;
    ;

    accountStatus = 2;
    acctype = Test;

如何声明用户设备以使其与 Realm 和 ObjectMapper 兼容。

【问题讨论】:

【参考方案1】:

有一个ObjectMapper extension for Realm 允许您处理领域List 属性。

在您上面的代码中,您没有将您的属性定义为 Realm 可以识别的属性。您需要为所有原始类型添​​加 dynamic 前缀,并为数组使用 Realm List 对象。

ObjectMapper 扩展有示例代码来展示如何解析 List 对象,但它应该看起来像这样:

class UserInfo: Object, Mappable

    dynamic var name: String?
    dynamic var identifier: String?
    dynamic var accountType: String?
    let devices = List<UserDevice>()

    func mapping(map: Map) 
        name       <- map["username"]
        identifier <- map["identifier"]
        accountType <- map["accountType"]
        devices    <- (map["devices"], ListTransform<User>())
    


class UserDevice: Object, Mappable

    dynamic var deviceName: String?
    dynamic var deviceType: String?
    dynamic var deviceIdentifier: String?

【讨论】:

感谢“动态”关键字。我正在使用它,但我忘了粘贴该代码。我已经尝试过您的方法,但它不起作用,因为如果我们将设备声明为 let devices = List() 对象映射器无法识别它们,因为它们是以字典数组的形式出现的。 如果我尝试标记动态 var userDevices: List?收到错误“无法将属性标记为动态,因为它的类型无法在 Objective-C 中表示”。 ObjectMapper 理解它在 JSON 中的保存方式。 我应该将设备声明为 let devices = [String:UserDevice] 以便 ObjectMapper 可以理解 JSON,否则 Objectmapper 总是返回 nil 嗯,好的。是的,Realm List 对象不是 Objective-C,所以它们不需要 dynamic 关键字。如果将其更改为[String:UserDevice],它将不会保存在 Realm 中。 嗯,我不能将对象声明为 [String:UserDevice]

以上是关于如何使用 ObjectMapper 和 Realm 对象声明字典的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire,Objectmapper,Realm:嵌套对象

swift 使用ObjectMapper将数组转换为Realm的List类型

复合键问题 Realm Swift

Realm Swift 返回所有 nil 值的对象

如何使用 ObjectMapper 将枚举的 rawValue 分配给变量?

领域 + 对象映射器 + SwityJSON