2016-02-20 15 views
5

Buduję aplikację z danymi podstawowymi (1 encja z 5 atrybutami), które wyświetlają się w tableView. Teraz chciałbym wyeksportować te dane do pliku CSV (aby móc wysłać ten plik pocztą z telefonu), aby móc otworzyć go w programie Excel w oknach. dużo wyszukiwałem, ale nie znalazłem właściwej odpowiedzi. Czy ktoś może mi pomóc lub podać link do dobrego wyjaśnienia lub samouczka?Jak utworzyć plik CSV z Core Data (Swift)

Szybko buduję.

func createExportString() -> String { 
    var merk: String? 
    var ref: String? 
    var beschrijving: String? 
    var aantal: String? 
    var wbs: String? 

    var export = NSLocalizedString("merk, ref, beschrijving, aantal, wbs \n", comment: "") 
      merk = Lijst.valueForKey("merk") as? String 
      ref = Lijst.valueForKey("ref") as? String 
      aantal = Lijst.valueForKey("aantal") as? String 
      beschrijving = Lijst.valueForKey("beschrijving") as? String 
      wbs = Lijst.valueForKey("wbs") as? String 


      let merkString = "\(merk!)" ?? "-" 
      let refString = "\(ref!)" ?? "-" 
      let beschString = "\(beschrijving!)" ?? "-" 
      let aantalString = "\(aantal!)" ?? "-" 
      let wbsString = "\(wbs!)" ?? "-" 

      export += merkString + "," + refString + "," + beschString + "," + aantalString + 
       "," + wbsString + "\n" 

    print("This is what the app will export: \(export)") 
    return export 
} 

@IBAction func saveToCSV(sender: AnyObject) { 
    exportDatabase() 
} 

func exportDatabase() { 
    var exportString = createExportString() 
    saveAndExport(exportString) 
} 

func saveAndExport(exportString: String) { 
    let exportFilePath = NSTemporaryDirectory() + "export.csv" 
    let exportFileURL = NSURL(fileURLWithPath: exportFilePath) 
    NSFileManager.defaultManager().createFileAtPath(exportFilePath, contents: NSData(), attributes: nil) 
    var fileHandleError: NSError? = nil 
    var fileHandle: NSFileHandle? = nil 
    do { 
     fileHandle = try NSFileHandle(forWritingToURL: exportFileURL) 
    } catch { 
     print("Error with fileHandle") 
    } 

    if fileHandle != nil { 
     fileHandle!.seekToEndOfFile() 
     let csvData = exportString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
     fileHandle!.writeData(csvData!) 

     fileHandle!.closeFile() 

     let firstActivityItem = NSURL(fileURLWithPath: exportFilePath) 
     let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil) 

     self.presentViewController(activityViewController, animated: true, completion: nil) 
    } 
} 
+0

Sprawdź http://stackoverflow.com/questions/10572172/how-to-export-core-data-to-csv – UlyssesR

+0

@UlyssesR i już do tego doszedłem, ale jestem dopiero początkującym i nie naprawdę mam pomysł, jak przekonwertować obejctive-c na szybkie ... –

+0

Może to krok po kroku wideo pomoże, https://www.youtube.com/watch?v=iBZbMkmtHuU – UlyssesR

Odpowiedz

6

Jest to zwięzły sposób robienia wszystkiego, co chcesz - przekazujesz tablicę zarządzanych obiektów i ciąg znaków, który jest nazwą pliku CSV. Metoda zapisuje plik CSV do pliku. Wydaje mi się, że masz już większość tego w swoim kodzie. Brakuje dwóch ostatnich linii, które po prostu wpisują ciąg do nowego pliku w katalogu "Dokumenty".

func writeCoreDataObjectToCSV(objects: [NSManagedObject], named: String) -> String { 
    /* We assume that all objects are of the same type */ 
    guard objects.count > 0 else { 
     return 
    } 
    let firstObject = objects[0] 
    let attribs = Array(firstObject.entity.attributesByName.keys) 
    let csvHeaderString = (attribs.reduce("",combine: {($0 as String) + "," + $1 }) as NSString).substringFromIndex(1) + "\n" 

    let csvArray = objects.map({object in 
     (attribs.map({(object.valueForKey($0) ?? "NIL").description}).reduce("",combine: {$0 + "," + $1}) as NSString).substringFromIndex(1) + "\n" 
    }) 
    let csvString = csvArray.reduce("", combine: +) 

    return csvHeaderString+csvString 
} 

Teraz gdzieś w kodzie trzeba utworzyć NSData z tego łańcucha i dodać go do poczty kompozytor:

let csvString = ..... 
let data = csvString.dataUsingEncoding(NSUTF8StringEncoding) 
let composer = MFMailComposeViewController() 
composer.addAttachmentData(attachment: data, 
      mimeType mimeType: "text/csv", 
      fileName filename: "mydata.csv") 

Następnie zrobić zwykły materiał z kompozytorem (zestaw ciała, tematu , itp.) i przedstawić go użytkownikowi!

EDYTOWANIE:

Edytowano odpowiedź, aby lepiej odpowiedzieć na pytanie.

+0

czy możesz podać mi jakieś wyjaśnienie tego kodu? gdzie umieścisz go w pliku i gdzie umieścisz ten kod w kontrolce viewcontroller? –

+0

W porządku, mój błąd. Zasadniczo robi to, co pozwala na eksport =. Będę edytować odpowiedź na ok. – Terminus

+0

. czy już zredagowałeś swoją odpowiedź? Naprawdę nie widzę różnicy? : p –