如何使用RealmSwift存储字典?

gab*_*han 21 dictionary realm ios swift

考虑以下型号:

class Person: Object {
    dynamic var name = ""
    let hobbies = Dictionary<String, String>()
}
Run Code Online (Sandbox Code Playgroud)

我想在境界去购买类型的对象[String:String],我从Alamofire请求得到了,但不能因为hobbies 通过定义let根据RealmSwift文档,因为它是一个List<T>/ Dictionary<T,U>种类型.

let hobbiesToStore: [String:String]
// populate hobbiestoStore
let person = Person()
person.hobbies = hobbiesToStore
Run Code Online (Sandbox Code Playgroud)

我也试图重新定义,init()但总是最终导致致命的错误.

如何在RealSwift中简单地复制或初始化Dictionary?我在这里错过了一些小事吗?

mar*_*ius 31

Dictionary在Realm中不支持属性类型.您需要引入一个新类,其对象描述每个键值对和多对象关系,如下所示:

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

class Hobby: Object {
    dynamic var name = ""
    dynamic var descriptionText = ""
}
Run Code Online (Sandbox Code Playgroud)

对于反序列化,您需要将JSON中的字典结构映射到Hobby对象,并将键和值分配给相应的属性.


bol*_*iva 26

我目前通过在我的模型上公开一个被忽略的Dictionary属性来模拟这个,它由一个私有的,持久的NSData支持,它封装了一个字典的JSON表示:

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"]
    }
}
Run Code Online (Sandbox Code Playgroud)

它可能不是最有效的方式,但它允许我继续使用Unbox快速轻松地将传入的JSON数据映射到我的本地Realm模型.


Ans*_*ais 5

我会将字典保存为 Realm 中的 JSON 字符串。然后检索 JSON 并转换为字典。使用以下扩展。

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]
} }
Run Code Online (Sandbox Code Playgroud)

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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也慢得要命,会使用 keyarchiver (2认同)

Coc*_*uts 5

2021 年更新

从 Realm 10.8.0 开始,可以使用Map类型在 Realm 对象中存储字典。

官方文档中的示例:

class Dog: Object {
    @objc dynamic var name = ""
    @objc dynamic var currentCity = ""
    // Map of city name -> favorite park in that city
    let favoriteParksByCity = Map<String, String>()
}
Run Code Online (Sandbox Code Playgroud)