2017-06-09 8 views
0

Ich muss Daten in meine tableView laden, wenn die App startet. Ich verwende Kerndaten, indem ich eine CSV-Datei analysiere. Ich muss die .csv-Datei von Zeit zu Zeit aktualisieren. Der Benutzer muss den Aktualisierungswert anzeigen. wenn ich den folgenden Code verwendetWie CSV-Dateiwert in SWIFT zu analysieren?

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 
} 

es nur die alten Daten von csv Datei zeigt. Aber wenn ich den folgenden Code

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) 
      } 
     } 
    } 
} 

Sein Auftritt Aktualisierungswert aber immer von csv Datei zu laden und nicht aus der Datenbank. Wie könnte dies erreicht werden?

Antwort

0

Sie zeigen den Code nicht an, aber ich nehme an, dass preloadData() die CSV-Datei aus dem Bundle in den Ordner Dokumente des Benutzers kopiert? (Andernfalls könnten Sie nicht schreiben.) Wenn Sie alte Daten sehen, sehen Sie sich die ursprüngliche .csv-Datei im Paket an (die schreibgeschützt ist).

Da Sie preloadData() jetzt bedingungslos aufrufen, muss preloadData() unterscheiden, woher die Daten kommen. Wenn es noch nicht in der Datenbank vorhanden ist, muss es dort abgelegt werden (Sie tun dies erfolgreich), und wenn Sie dies bereits getan haben, muss es die Daten aus der Datenbank laden. Wenn Sie das richtig machen, muss der Rest Ihres Programms seine Daten nur von der Datenbank beziehen.

EDIT:

In preloadData() Sie sind:

die CSV-von Ihrem Bündel liest (jedes Mal, wenn Sie die App starten)

den Inhalt der CSV zu Ihrem Coredata Datenspeicher Speicher (jedes Mal)

aber Sie fragen nie die Datenbank nach Daten (und sollte wahrscheinlich nicht hier, sowieso). In Ihrem View-Controller können Sie die Datenbank nach Ihren Objekten abfragen (eventuell mit einem Abruf-Controller) ....

+0

Ich habe 'preloadData()' Methode hinzugefügt. – Alamin