我需要在应用启动时将数据预加载到我的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
文件加载,而不是从数据库加载。怎么可以实现呢?
答案 0 :(得分:0)
您没有显示代码,但我认为preloadData()正在将.csv文件从捆绑包复制到User's Documents文件夹? (否则您将无法写入)当您看到旧数据时,您是否正在查看捆绑包中的原始.csv文件(这是只读的)?
由于您现在无条件地调用preloadData(),preloadData()需要区分数据的来源。如果它还没有在数据库中,它需要把它放在那里(你成功地做到了),如果你已经这样做了,它需要从数据库加载数据。如果您正确执行此操作,则程序的其余部分只需从数据库获取其数据。
编辑:
在preloadData()中你是:
从您的软件包中读取.csv(每次启动应用程序时)
将csv的内容保存到CoreData数据存储区(每次)
但你永远不会向数据库询问数据(反正可能不应该在这里)。在视图控制器中,您可以在数据库中查询对象(可能使用获取控制器)....