Есть ли автоматический способ вставить сущность в CoreData при разборе его поля из CSV? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь предварительно загрузить данные из 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....
...