在 Realm swift4 中存储带有列表的嵌套模型对象

Store nested model object with list in Realm swift4

我有以下回复 api

{
    "status": true,
    "allClasses": [
        {
            "ClassId": "4",
            "class": "I",
            "Divisions": [
                {
                    "DivId": "1",
                    "division": "A",
                    "Subjects": [
                        {
                            "SubId": "28",
                            "subject": "Hindi",
                            "subSubject": "Hindi"
                        },
                        {
                            "SubId": "29",
                            "subject": "Hindi",
                            "subSubject": "Hindi I"
                        },
                        {
                            "SubId": "33",
                            "subject": "Hindi",
                            "subSubject": "Literature"
                        }
                    ]
                }
            ]
        },
        {
            "ClassId": "5",
            "class": "II",
            "Divisions": [
                {
                    "DivId": "2",
                    "division": "A",
                    "Subjects": [
                        {
                            "SubId": "33",
                            "subject": "Hindi",
                            "subSubject": "Literature"
                        }
                    ]
                },
                {
                    "DivId": "4",
                    "division": "B",
                    "Subjects": []
                }
            ]
        },
        {
            "ClassId": "6",
            "class": "III",
            "Divisions": [
                {
                    "DivId": "3",
                    "division": "A",
                    "Subjects": []
                }
            ]
        },
        {
            "ClassId": "1",
            "class": "Nursery",
            "Divisions": [
                {
                    "DivId": "5",
                    "division": "A",
                    "Subjects": []
                }
            ]
        },
        {
            "ClassId": "2",
            "class": "Jr KG",
            "Divisions": [
                {
                    "DivId": "6",
                    "division": "A",
                    "Subjects": []
                }
            ]
        },
        {
            "ClassId": "3",
            "class": "Sr KG",
            "Divisions": [
                {
                    "DivId": "7",
                    "division": "A",
                    "Subjects": []
                }
            ]
        }
    ]
}

我想将这些数据存储到 Realm 中,所以我为 Object

创建了以下模型类
class classList : Object{
@objc dynamic  var ClassId ,className : String?
var divArr = List<divList>()
convenience init(ClassId: String,className : String, divArr : List<divList>) 
{
    self.init()
    self.ClassId = ClassId
    self.className = className
    self.divArr = divArr
}
}
class divList : Object {
@objc dynamic  var DivId ,division : String?
var subArr = List<subjectList>()
convenience init(DivId: String,division : String, subArr : List<subjectList>) 
{
    self.init()
    self.DivId = DivId
    self.division = division
    self.subArr = subArr
}
}
class subjectList : Object{
@objc dynamic var SubId ,subject,subSubject : String?
convenience init(SubId: String,subject : String,subSubject : String){
    self.init()
    self.SubId = SubId
    self.subject = subject
    self.subSubject = subSubject
}
}

在下面的代码中,我解析了这个响应并尝试将最终对象存储到 Realm

var classListArr = List<classList>()
var divListArr = List<divList>()
var subListArr = List<subjectList>()

if status
                {
                    //first remove data from realm
                   let removeClass = RealmService.shared.realm.objects(classList.self)
                    let realm = try! Realm()
                    try! realm.write {
                        realm.delete(removeClass)
                    }
                    let allClasses = json!["allClasses"].arrayValue
                  // self.classListArr.removeAll()
                    for classess in allClasses
                    {
                       let Divisions = classess["Divisions"].arrayValue
                        // self.divListArr.removeAll()
                        for div in Divisions
                        {
                            let Subjects = div["Subjects"].arrayValue
                           //  self.subListArr.removeAll()
                            for sub in Subjects
                            {
                                let subjectListObj = subjectList()
                                subjectListObj.SubId = sub["SubId"].stringValue
                                subjectListObj.subject = sub["subject"].stringValue
                                subjectListObj.subSubject = sub["subSubject"].stringValue
                                self.subListArr.append(subjectListObj)
                            }
                            self.classDIvArr.append(classDiv(DivId: div["DivId"].stringValue, division: div["division"].stringValue, ClassId: classess["ClassId"].stringValue, className: classess["class"].stringValue))
                            let divListObj = divList()
                            divListObj.DivId = div["DivId"].stringValue
                            divListObj.division = div["division"].stringValue
                            divListObj.subArr = self.subListArr
                           self.divListArr.append(divListObj)
                        }

                        //store fresh data into realm
                        let classObj = classList()
                        classObj.ClassId = classess["ClassId"].stringValue
                        classObj.className = classess["class"].stringValue
                        classObj.divArr = self.divListArr
                        RealmService.shared.create(classObj)
                    }
                    self.stopActivityIndicator()
                   // self.setDataInDB()
                    self.classTableView.reloadData()
                }

但是当我尝试执行我的代码时,应用程序崩溃了,我收到了以下错误

*** Terminating app due to uncaught exception 'RLMException', reason: 'Cannot modify managed RLMArray outside of a write transaction.'

您正试图在写入事务之外修改 Realm 对象数组。

Realm 有一些限制,所以你应该使用:

try! realm.write {
  RealmService.shared.create(classObj)
}