如何在Swift中解析更新CSV文件值?

时间:2017-06-09 09:57:56

标签: ios swift csv

我需要在应用启动时将数据预加载到我的tableView。我通过解析.csv文件来使用核心数据。 我需要不时更新.csv文件。用户必须显示更新值。 如果我使用以下代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {


    let defaults = UserDefaults.standard
    let isPreloaded = defaults.bool(forKey: "isPreloaded")
    if !isPreloaded{
        preloadData()
        defaults.set(true, forKey: "isPreloaded")
    }

    return true
}

它只显示csv文件的旧数据。但如果我使用以下代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    preloadData()
    return true
}

func preloadData() {
    // Load the data file. For any reasons it can't be loaded, we just return


    guard let contentsOfURL = Bundle.main.url(forResource: "menudata",withExtension: "csv") else {
           return
    }

    // Remove all the menu items before preloading
    removeData()
    // Parse the CSV file and import the data
    if let items = parseCSV(contentsOfURL: contentsOfURL, encoding:
        String.Encoding.utf8) {
        let context = persistentContainer.viewContext
        for item in items {
            let menuItem = MenuItem(context: context)
            menuItem.name = item.name
            menuItem.detail = item.detail
            menuItem.price = Double(item.price) ?? 0.0
            do {
                try context.save()
            } catch {
                print(error)
            }
        }
    }
}

它显示更新值但总是从csv文件加载,而不是从数据库加载。怎么可以实现呢?

1 个答案:

答案 0 :(得分:0)

您没有显示代码,但我认为preloadData()正在将.csv文件从捆绑包复制到User's Documents文件夹? (否则您将无法写入)当您看到旧数据时,您是否正在查看捆绑包中的原始.csv文件(这是只读的)?

由于您现在无条件地调用preloadData(),preloadData()需要区分数据的来源。如果它还没有在数据库中,它需要把它放在那里(你成功地做到了),如果你已经这样做了,它需要从数据库加载数据。如果您正确执行此操作,则程序的其余部分只需从数据库获取其数据。

编辑:

在preloadData()中你是:

从您的软件包中读取.csv(每次启动应用程序时)

将csv的内容保存到CoreData数据存储区(每次)

但你永远不会向数据库询问数据(反正可能不应该在这里)。在视图控制器中,您可以在数据库中查询对象(可能使用获取控制器)....