2017-11-22 4 views
0

Ich entwickle eine iOS App mit Swift (noch neu zu swift).Swift: Ich möchte eine Liste von Ländern mit vielen Attributen aus einer CSV-Datei lesen und diese für meine App verwenden. Wie kann ich das umsetzen?

Ich habe eine Datenbank als CSV-Datei gespeichert und das ist in erster Linie der Kern der App. Die Datenbank enthält eine Tabelle, die in eine Liste aller Länder (Zeilen) mit jeweils vielen Attributen/Deskriptoren (den Spalten) unterteilt ist. Wirklich gibt es keine Beziehung zwischen den Ländern.

Ich möchte diese Informationen für das (ausgewählte) Land in meiner App anzeigen können. Genauso wie andere Dinge wie Suchen/Filtern/Sortieren basierend auf dem ausgewählten Attribut/der ausgewählten Eigenschaft.

Die Datenbank könnte in der Zukunft mit der Veröffentlichung von App-Updates aktualisiert werden, aber anders als ich denke, ich möchte es einmal aus der CSV-Datei gelesen werden und dann verwendet die App diese Daten.

Bin ich der Meinung, dass der beste Weg, dies zu implementieren, die Verwendung von Core Data mit ONE Entity (Land) mit den verschiedenen Attributen ist? Also muss ich nur einmal die CSV-Datei lesen und alle Daten persistent speichern und von dort aus verwenden.

Oder ist Core Data nicht die beste Implementierung? Soll ich einfach ein Klassenland mit den vielen Attributen erstellen und das verwenden? Aber das heißt dann, dass die App die CSV jedes Mal lesen muss, wenn sie geöffnet wird und die Daten in Arrays usw. speichert, wenn ich filtern oder sortieren möchte?

Also ich denke, zusammenfassend meine Fragen sind: 1. Verwenden Sie Core Data oder nicht? Wenn nicht, was ist Ihrer Meinung nach die beste Umsetzung? 2. Wenn ich Core Data verwende, erstelle ich nur EINE Entität (also keine Beziehungen usw.).

+0

Ich denke, es gibt keine "richtige" oder "falsche" Antwort darauf. Sie können CoreData sicher verwenden (und kostenlos eine Menge Funktionen wie synchronisierte 'UITableView's usw.) bekommen. Wenn Sie sich entscheiden, damit zu gehen, [ist hier] (https://www.objc.io/issues/4-core-data/importing-large-data-sets-into-core-data/) ein ausgezeichneter Artikel von objc.io auf Datensatz importieren – Alladinian

+0

Vielen Dank für Ihre Antwort.Würdest du sagen, dass meine Datenbank dann EINE Entität enthalten würde, die das Land ist und alles andere als Attribute für die Entität Land gilt? –

Antwort

0

Was Sie so sehen würden ist, dass Sie dies in Ihre Datenbank Ihrer Wahl laden möchten; Also CoreData oder SQLite oder sogar Realm würde funktionieren.

Falls Sie noch keine Daten für eine von ihnen haben und sie mit swift laden möchten, ist dies ein Parser, den ich für eine ähnliche Situation geschrieben habe, wo CSV meine Rohdatenquelle ist, die ich parsen muss :

if let listFile = try? String(contentsOfFile: path) { 
       let lines = listFile.components(separatedBy: "\n") 

       // NOTE: There is also a CSV format that uses ',' as a separator 
       // So verify if yours uses ';' or ',' 
       let rows: [[String: String]] = lines.flatMap() { 
        (item) -> [String: String]? in 
        let components = item.components(separatedBy: ";") 
        if components.count != 3 { 
         return nil 
        } 
        // Modify this part to parse the X amount of columns 
        // you have in your countries.csv 
        let dict = [ 
         "identity": components[0], 
         "description": components[1].lowercased(), 
         "points":  components[2] 
        ] 
        return dict 
       } 
      } 

} 

Dann, nachdem Sie die Daten in einem Format [[String: String]] haben könnten Sie diese Zeile für Zeile analysieren und sie in die Datenbank einfügen Sie verwenden wollte.

Ich glaube an Swift4 es möglich sein sollte, die neuen Codable Protokolle zu verwenden, um ein Ergebnis zu erzielen, die viel sauberer aussehen würde; aber ich habe noch keinen Encoder/Decoder für CSV-Dateien geschrieben, der es Ihnen erlauben würde, dies zu tun. Wenn es einen gibt, werde ich es hier posten.

Es gibt auch einen CSV-Parser auf Github hier verfügbar: SwiftCSV Ich habe es noch nie verwendet, aber wer weiß; könnte hilfreich für Sie sein.

+0

Vielen Dank für Ihre Antwort. Würdest du sagen, dass meine Datenbank dann EINE Entität enthalten würde, die das Land ist und alles andere als Attribute für die Entität Land gilt? –

+0

@ A.Zada Ihre Datenbank sollte den Namen des Landes als primäres Feld haben (ich habe die Terminologie in CoreData vergessen, aber die Funktionalität ist da), so dass Sie es schnell nachschlagen und/oder Queries darauf durchführen können. Der Rest der Daten dieses Landes sollte Attribute des Artikels sein. Die Übertragung der CSV-Datei in eine Datenbank dient dem effizienten Zugriff auf die benötigten Daten. Das Parsen von mehr als 200 Textzeilen jedes Mal, wenn Sie bestimmte Informationen benötigen, ist bestenfalls verschwenderisch. –

+0

Tolles Dankeschön das hat geholfen! –

Verwandte Themen