I'm trying to save JSON to CoreData but the JSON is a little bit complex with many array objects. I could only save and display simple attributes like String, Int... but if I add attributes with Transformable type like [Currency], [Double], the app will crash.
Could you please show me the right way to implement this?
My Data Model
struct Currency: Decodable {
let code, name, symbol: String?
}
struct Language : Decodable {
let name : String?
}
struct WorldData: Identifiable, Decodable {
var id : Int {
return population
}
var name : String?
...
var latlng : [Double]?
var currencies : [Currency]?
var languages : [Language]
...
}
My Manual NSManagedObject subclass
extension CDCountry {
@nonobjc public class func fetchRequest() -> NSFetchRequest<CDCountry> {
return NSFetchRequest<CDCountry>(entityName: "CDCountry")
}
@NSManaged public var name: String?
@NSManaged public var latlng: NSObject?
@NSManaged public var currencies: NSObject?
@NSManaged public var languages: NSObject?
...
public var wrapperLatlng : NSObject {
latlng ?? ["Unknown error"] as NSObject
}
public var wrapperCurrencies : NSObject {
currencies ?? ["Unknown error"] as NSObject
}
...
and how I save loaded JSOn to CoreData
static func loadDataToCD(moc: NSManagedObjectContext) {
loadDataFromJSON { (countries) in
DispatchQueue.main.async {
var tempCountries = [CDCountry]()
for country in countries {
let newCountry = CDCountry(context: moc)
...
newCountry.currencies = country.currencies as NSObject?
newCountry.languages = country.languages as NSObject
newCountry.latlng = country.latlng as NSObject?
newCountry.name = country.name
...
tempCountries.append(newCountry)
}
do {
try moc.save()
} catch let error {
print("Could not save to CD: ", error.localizedDescription)
}
}