Я пытаюсь предварительно загрузить данные из CSV-файла в модель Core Data в Swift 4, чтобы иметь возможность заполнить базу данных при первом использовании моего приложения. Я могу правильно проанализировать CSV-файл и создать массив словарей (каждый из которых содержит имена столбцов в качестве ключей и связанных значений):
// rows contains the collection of data I want to preload
if let rows : [[String:String]] = CSV.parse(url: url, encoding: String.Encoding.utf8) {
for e in rows {
// insert entity
insertNewEntity(entityName: "Exercise", inContext: context, data: e)
}
}
Эта функция должна создать новую сущность, используя поля словаря выше, и вставить ее в контекст:
func insertNewEntity(entityName:String, inContext: NSManagedObjectContext, data:[String:String]) {
let entity = NSEntityDescription.entity(forEntityName: entityName, in: inContext)
let new = NSManagedObject(entity: entity!, insertInto: inContext)
for (key,value) in data {
new.setValue(value, forKey: key) // <- exception here
}
}
Но инструкция new.setValue (value, forKey: key) завершается ошибкой:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "level"; desired type = NSNumber; given type = NSTaggedPointerString; value = 0.'
Существует ли автоматический способ преобразования строки в правильный тип поля вместо того, чтобы делать, как показано ниже для каждого поля сущности?
let exercise = Exercise(context: context)
exercise.id = Int16(e["id"]!)!
exercise.name = e["name"] // ok because string field
exercise.level = Int16(e["level"]!)!
// and so on for other 20 fields....