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" } }}