Добавление массива данных Json в Realm - PullRequest
0 голосов
/ 18 ноября 2018

Я делаю приложение для аэропортов и получаю массив данных из одного API, например:

"data":[
{"id":"001","code":"ABZ","name":"Aberdeen","country":"United Kingdom"},
{"id":"002","code":"AUH","name":"Abu Dhabi","country":"United Arab Emirates"},
.
.
.
]

И:

"airports":[
{"from":"001",
    "to":["1","3","11","13","12","20","23","27","29","31","33"]
},
.
.
.
]

Я создалклассы моделей областей:

class AirportsDataRealm: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var id: Int = 0
    @objc dynamic var code: String = ""
    @objc dynamic var country: String = ""
    override static func primaryKey() -> String? {
        return "id"
    }
}

class AirportsFromToRealm: Object {
    @objc dynamic var fromID: Int = 0
    var toID = List<Int>()
    override static func primaryKey() -> String? {
        return "fromID"
    }
}

теперь я хочу сохранить их в области, я использую swiftyJSON, и я использовал цикл for, чтобы сделать это, и он работает нормально, но я думаю, что это занимает много времени, так какмассив очень длинный, вот что я сделал:

    // Airports Data
    let countData = json["data"].count
    for i in 0...countData - 1{
        let airportsDataModel = AirportsDataRealm()
        airportsDataModel.code = json["data"][i]["code"].stringValue
        airportsDataModel.name = json["data"][i]["name"].stringValue
        airportsDataModel.country = json["data"][i]["country"].stringValue
        airportsDataModel.id = Int(json["data"][i]["id"].stringValue)!
        try! realm.write {
            realm.add(airportsDataModel, update: true)
        }
    }

    //Airports FROM-TO
    let countFromTo = json["airports"].count

    for i in 0...countFromTo - 1{
        let fromToDataModel = AirportsFromToRealm()
        fromToDataModel.fromID = Int(json["airports"][i]["from"].stringValue)!
        let arrayTo = json["airports"][i]["to"].arrayValue.map{ $0.intValue }
        fromToDataModel.toID.append(objectsIn: arrayTo)

        try! realm.write {
            realm.add(fromToDataModel, update: true)
        }
    }

есть ли способ сохранить весь массив в области одним кадром без цикла for?

PS "между двумя таблицами должно быть отношение, потому что у каждой из 'id' есть список идентификаторов 'to', а идентификаторы - из таблицы данных, сейчас мне удалось создать эти отношения при извлечении данных с использованием фильтров, поэтому простоигнорировать это "

Спасибо

1 Ответ

0 голосов
/ 22 ноября 2018

Просто используйте метод карты,

Сначала мне нужно было добавить инициализаторы в мои классы объектов и передать массив json в качестве параметра, например так:

class AirportsDataRealm: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var id: Int = 0
    @objc dynamic var code: String = ""
    @objc dynamic var country: String = ""
    convenience required init(withJSON json : JSON) {
        self.init()
        self.name = json["name"].stringValue
        self.id = json["id"].intValue
        self.code = json["code"].stringValue
        self.country = json["country"].stringValue
    }
    override static func primaryKey() -> String? {
        return "id"
    }
}


class AirportsFromToRealm: Object {
    @objc dynamic var fromID: Int = 0
    var toID = List<Int>()
    convenience required init(withJSON json : JSON) {
        self.init()
        self.fromID = json["from"].intValue
        let toArray = json["to"].arrayValue.map{ $0.intValue }
        self.toID.append(objectsIn: toArray)
    }

    override static func primaryKey() -> String? {
        return "fromID"
    }
}

Тогда при использовании метода map код будет выглядеть так:

func updateAirport(json: JSON) {
        // Airports Data
        let airportsData : [AirportsDataRealm]
        let airportsDataJsonArray = json["data"].array
        airportsData = airportsDataJsonArray!.map{AirportsDataRealm(withJSON: $0)}
        //Airports FROM-TO
        let airportsFromTo : [AirportsFromToRealm]
        let airportsFromToJsonArray = json["airports"].array
        airportsFromTo = airportsFromToJsonArray!.map{AirportsFromToRealm(withJSON: $0)}
        //Write To Realm
        try! realm.write {
            realm.add(airportsData, update: true)
            realm.add(airportsFromTo, update: true)
        }
}

Больше нет циклов ^ _ ^

...