2016-02-20 21 views
5

Sto costruendo un'app con dati di base (1 entità con 5 attributi) che vengono visualizzati in una tabellaView. Ora vorrei esportare questi dati in un file CSV (così posso inviare questo file con la posta dal telefono) così posso aprirlo in Excel su Windows. cerco molto ma non ho trovato la risposta giusta. Qualcuno può aiutarmi o darmi un link ad una buona spiegazione o tutorial?Come creare un file CSV da Core Data (swift)

Sto costruendo in swift btw.

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

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

+0

@UlyssesR sono già venuto a quello, ma sono solo un principiante e non hai davvero un'idea su come convertire obejctive-c per swift ... –

+0

Forse questo video passo dopo passo ti aiuta, https://www.youtube.com/watch?v=iBZbMkmtHuU – UlyssesR

risposta

6

Questo è un modo conciso per fare tutto ciò che si desidera: si passa una serie di oggetti gestiti e una stringa che è il nome file di CSV. Il metodo scrive il tuo CSV in un file. Credo che tu abbia già la maggior parte di questo nel tuo codice, la cosa che manca sono le ultime due righe che scrivono semplicemente una stringa in un nuovo file nella directory "Documenti".

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 
} 

Ora, da qualche altra parte nel codice è necessario creare NSData da questa stringa e aggiungerlo alla posta compositore:

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

Quindi, fare la solita roba con il compositore (corpo insieme, argomento , ecc.) e presentarlo all'utente!

EDIT:

cura la risposta per rispondere meglio alla domanda.

+0

potresti darmi qualche altra spiegazione per questo codice? dove lo metti in un file e dove metti questo codice nel viewcontroller? –

+0

Bene, mio ​​errore. Questo fondamentalmente fa sì che export = faccia. Modificherò la risposta – Terminus

+0

ok. hai già modificato la tua risposta? non vedo davvero una differenza? : p –