Reputation: 2132
I try to read json and create Realm, so my code:
func workWithFileJSON () {
//local file JSON
let file = Bundle.main.path(forResource: "MobileDbSchema", ofType: "json")!
let url = URL(fileURLWithPath: file)
let jsonData = NSData(contentsOf: url)!
//Parce JSON
let json = try! JSONSerialization.jsonObject(with: jsonData as Data, options: [])
try! realm.write {
//Create data from JSON to our objects
realm.create(DataRoot.self, value: json, update: true)
}
}
and file with classes:
import Foundation
import RealmSwift
class DataRoot: Object {
dynamic var id = 0
dynamic var name = ""
let transport_type = List<Transport_type>()
override class func primaryKey() -> String? {
return "id"
}
}
class Transport_type: Object {
dynamic var id = 0
dynamic var name = ""
let routes = List<Routes>()
override class func primaryKey() -> String? {
return "id"
}
}
class Routes: Object {
dynamic var id = 0
dynamic var name = ""
let directions = List<Directions>()
override class func primaryKey() -> String? {
return "id"
}
}
class Directions: Object {
dynamic var id = 0
dynamic var name = ""
dynamic var dayIdFrom = 0
dynamic var dayIdTo = 0
let stops = List<Stops>()
override class func primaryKey() -> String? {
return "id"
}
}
class Stops: Object {
dynamic var id = 0
dynamic var busStop: BusStop?
let timetable = List<Timetable>()
override class func primaryKey() -> String? {
return "id"
}
}
class BusStop: Object {
dynamic var id = 0
dynamic var name = ""
dynamic var descript = ""
override class func primaryKey() -> String? {
return "id"
}
}
class Timetable: Object {
dynamic var hour = 0
dynamic var minute = 0
dynamic var group_index = 0
dynamic var notes = ""
}
after my first run I see good data in Realm:
but after second run I see data in Timetable
x 2 and etc. time after each run.
In Timetable there are no primary keys (here don't need it). Why after each update (run) I see increase data in Timetable
and how to resolve my mistake?
Upvotes: 1
Views: 837
Reputation: 15991
Even if your app doesn't need primary keys, Realm.add(_:update:)
requires your Object
class to implement one so it is able to identify pre-existing entries as opposed to new ones. If you do not specify a primary key, even if update:
is set to true
, it will add each item from JSON as a new object.
Ideally, you should be able to implement some kind of primary ID for each entry in the JSON feed so you can simply pass that along to Realm.
However, if you cannot implement primary keys, but you know that every new JSON object you pull down is a complete snapshot of your timetables, then you could also simply consider deleting all of the pre-existing timetable objects in your Realm file before adding the latest ones from the JSON file.
Upvotes: 2