我在我的Swift项目中使用了Realm,并且有一个带有几个嵌套属性的相当长的JSON文件。我知道为了让Realm直接使用这个序列化的JSON数据,属性需要完全匹配(https://realm.io/docs/swift/latest/#json)。
但是因为Realm Lists需要一个Object而不是一个String,所以我必须使用像List这样的需求是一个Realm对象,它包含一个名为' value'的单个字符串。
当我运行此代码时:
try! realm.write {
let json = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
let exhibit = Exhibit(value: json)
exhibit.id = "1"
realm.add(exhibit, update: true)
}
我收到此错误消息: ***由于未捕获的异常终止应用程序' RLMException',原因:' req1'初始化类型对象'要求':缺少关键值''
这是我在那里喂养的JSON的缩短版本:
{
"exhibit_name": "test1",
"requirements": [
"req1",
"req2"
],
"geofence": {
"latitude": 36.40599779999999,
"longitude": -105.57696279999999,
"radius": 500
}
}
我的Realm模型类是这样的:
class Exhibit: Object {
override static func primaryKey() -> String? {
return "id"
}
dynamic var id = "0" //primary key
dynamic var exhibit_name: String = ""
let requirements = List<Requirements>()
dynamic var geofence: Geofence?
}
class Geofence: Object {
dynamic var latitude: Float = 0.0
dynamic var longitude: Float = 0.0
dynamic var radius: Float = 0.0
}
class Requirements: Object {
dynamic var value = ""
}
我觉得有趣的是我没有收到Geofence属性的任何错误,因为那是一本字典。
如何设置需求模型以使其正常工作?
答案 0 :(得分:1)
很遗憾,您无法以不同的方式设置Requirements
模型,这样您就可以直接将JSON映射到Realm对象。
init(value: AnyObject)
初始化程序需要字典,其中键是对象属性的名称,或者是数组,其中属性值的排序方式与对象模型中定义的相同。递归调用此初始值设定项用于相关对象。
因此,要使其工作,您需要转换JSON,以便将字符串值嵌套到字典或数组中。在您的具体情况下,您可以实现如下所示:
…
var jsonDict = json as! [String : AnyObject]
jsonDict["requirements"] = jsonDict["requirements"].map { ["value": $0] }
let exhibit = Exhibit(value: jsonDict)
…
我建议您为Realm模型对象类使用单数名称(此处为Requirement
而不是Requirements
),因为每个对象只代表一个实体,即使您仅将它们用于 - 许多关系。