意见:有没有更好的方法将数据保存到解析后的CSV文件中的核心数据

时间:2017-02-03 08:05:44

标签: csv core-data swift3

我正在将csv文件解析为核心数据。我正在解析文件并在一个函数中同时将数据保存到CD中。如果这是一个好方法,我有兴趣得到一些反馈意见吗?它确实有效,数据被保存。为了使事情变得简单,所有实体属性都是字符串。我是swift的新手,所以我希望确保我没有犯任何新手错误。这是功能。 我有一个问题。我现在不确定是否将文件中的数据保存到与Asteroids实体有关系的同一数据模型中的不同实体中的属性。例如,Resources实体中的资源和数量属性。

func parseAsteroidCSVForCD(){

    let context = getContext()
    let entity = NSEntityDescription.entity(forEntityName: "Asteroid", in: context)
    let manageObj = NSManagedObject(entity: entity!, insertInto: context)


    // Path variable to the asteroids.csv file
    let path = Bundle.main.path(forResource: "asteroids", ofType: "csv")!

    // Parse the file in a do catch
    do {
        // Use the paser to pull out the rows
        let csv = try CSV(contentsOfURL: path)
        let rows = csv.rows

        // Go through each row to store the id, name, size, distance and value
        for row in rows {
            let id = row["id"]!
            let name = row["name"]!
            let size = row["size"]!
            let distance = row["distancefromEarth"]!
            let value = row["value"]!

            // load into Core Data here
            manageObj.setValue(id, forKey: "id")
            manageObj.setValue(name, forKey: "name")
            manageObj.setValue(size, forKey: "size")
            manageObj.setValue(value, forKey: "value")
            manageObj.setValue(distance, forKey: "distance")

            do {
                try context.save()
                print("New Asteroid has been created")

            } catch {
                print(error.localizedDescription)
            }

        }

    } catch let err as NSError {

        print(err.debugDescription)
    }
}

1 个答案:

答案 0 :(得分:0)

使用此逻辑,不会插入所有CSV行。因为你只创建了一个" manageObj"并继续设置每一行的值。所以最后你将只有一个" manageObj"最后一行的值。

实体创建应该在for循环中,这样对于每一行,都会创建一个新实体。并且不要在for循环中保存。一旦for循环完成,保存它..单个保存..