How can I store a Dictionary with RealmSwift? How can I store a Dictionary with RealmSwift? swift swift

How can I store a Dictionary with RealmSwift?


Dictionary is not supported as property type in Realm.You'd need to introduce a new class, whose objects describe each a key-value-pair and to-many relationship to that as seen below:

class Person: Object {    dynamic var name = ""    let hobbies = List<Hobby>()}class Hobby: Object {    dynamic var name = ""    dynamic var descriptionText = ""}

For deserialization, you'd need to map your dictionary structure in your JSON to Hobby objects and assign the key and value to the appropriate property.


I am currently emulating this by exposing an ignored Dictionary property on my model, backed by a private, persisted NSData which encapsulates a JSON representation of the dictionary:

class Model: Object {    private dynamic var dictionaryData: NSData?    var dictionary: [String: String] {        get {            guard let dictionaryData = dictionaryData else {                return [String: String]()            }            do {                let dict = try NSJSONSerialization.JSONObjectWithData(dictionaryData, options: []) as? [String: String]                return dict!            } catch {                return [String: String]()            }        }        set {            do {                let data = try NSJSONSerialization.dataWithJSONObject(newValue, options: [])                dictionaryData = data            } catch {                dictionaryData = nil            }        }    }    override static func ignoredProperties() -> [String] {        return ["dictionary"]    }}

It might not be the most efficient way but it allows me to keep using Unbox to quickly and easily map the incoming JSON data to my local Realm model.


I would save the dictionary as JSON string in Realm. Then retrive the JSON and convert to dictionary. Use below extensions.

extension String{func dictionaryValue() -> [String: AnyObject]{    if let data = self.data(using: String.Encoding.utf8) {        do {            let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: AnyObject]            return json!        } catch {            print("Error converting to JSON")        }    }    return NSDictionary() as! [String : AnyObject]} }

and

extension NSDictionary{    func JsonString() -> String    {        do{        let jsonData: Data = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted)        return String.init(data: jsonData, encoding: .utf8)!        }        catch        {            return "error converting"        }    }}