Ios 如何在Swift 3中将核心数据导出到CSV?

Ios 如何在Swift 3中将核心数据导出到CSV?,ios,swift,csv,core-data,export,Ios,Swift,Csv,Core Data,Export,我想导出实体“日志”的所有数据。我发现以下代码示例: 但这对我不起作用。它没有添加核心数据的数据,我得到的唯一输出是:“这是应用程序将导出的内容:日期、标签、类型” 我的核心数据实体是“Log”,具有以下属性:date(类型:date)、labe1(类型:String)和typ(类型:Double)。 如何将核心数据导出到CSV文件并通过邮件发送? 谢谢你的帮助:) 我在“logs=[result]”行中得到错误: 使用未解析标识符“result”这是我用于Swift 4.2的解决方案 更新以匹

我想导出实体“日志”的所有数据。我发现以下代码示例: 但这对我不起作用。它没有添加核心数据的数据,我得到的唯一输出是:“这是应用程序将导出的内容:日期、标签、类型” 我的核心数据实体是“Log”,具有以下属性:date(类型:date)、labe1(类型:String)和typ(类型:Double)。 如何将核心数据导出到CSV文件并通过邮件发送? 谢谢你的帮助:)

我在“logs=[result]”行中得到错误:
使用未解析标识符“result”

这是我用于Swift 4.2的解决方案

更新以匹配存储库中的代码。

import UIKit
import CoreData

class ViewController: UIViewController {

    var itemid = 178
    var nametext = "Jones3"
    var amountDouble = 68
    var inventoryDate: Date? = Date()
    var stockStatus = true
    var fetchedStatsArray: [NSManagedObject] = []
    let context = CoreDataStack.context

    override func viewDidLoad() {
        super.viewDidLoad()
        // This add a new record every time the app is run
        storeTranscription()
        // Loads the current data
        getTranscriptions()
    }

    @IBAction func exportButton(_ sender: UIButton) {
        exportDatabase()
    }

    func storeTranscription() {
        //retrieve the entity that we just created
        let entity =  NSEntityDescription.entity(forEntityName: "ItemList", in: context)
        let transc = NSManagedObject(entity: entity!, insertInto: context) as! ItemList

        //set the entity values
        transc.itemID = Double(itemid)
        transc.productname = nametext
        transc.amount = Double(amountDouble)
        transc.stock = stockStatus
        transc.inventoryDate = inventoryDate

        //save the object
        do {
            try context.save()
            print("saved!")
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        } catch {

        }
    }

    func getTranscriptions () {
        //create a fetch request, telling it about the entity
        let fetchRequest: NSFetchRequest<ItemList> = ItemList.fetchRequest()

        do {
            //go get the results
            let searchResults = try context.fetch(fetchRequest)
            fetchedStatsArray = searchResults as [NSManagedObject]
            //I like to check the size of the returned results!
            print ("num of results = \(searchResults.count)")
            //You need to convert to NSManagedObject to use 'for' loops
            for trans in searchResults as [NSManagedObject] {
                //get the Key Value pairs (although there may be a better way to do that...
                print("\(trans.value(forKey: "productname")!)")
                let mdate = trans.value(forKey: "inventoryDate") as! Date
                print(mdate)
            }

        } catch {
            print("Error with request: \(error)")
        }
    }

    func exportDatabase() {
        let exportString = createExportString()
        saveAndExport(exportString: exportString)
    }

    func saveAndExport(exportString: String) {
        let exportFilePath = NSTemporaryDirectory() + "itemlist.csv"
        let exportFileURL = NSURL(fileURLWithPath: exportFilePath)
        FileManager.default.createFile(atPath: exportFilePath, contents: NSData() as Data, attributes: nil)
        //var fileHandleError: NSError? = nil
        var fileHandle: FileHandle? = nil
        do {
            fileHandle = try FileHandle(forWritingTo: exportFileURL as URL)
        } catch {
            print("Error with fileHandle")
        }

        if fileHandle != nil {
            fileHandle!.seekToEndOfFile()
            let csvData = exportString.data(using: String.Encoding.utf8, allowLossyConversion: false)
            fileHandle!.write(csvData!)

            fileHandle!.closeFile()

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

            activityViewController.excludedActivityTypes = [
                UIActivity.ActivityType.assignToContact,
                UIActivity.ActivityType.saveToCameraRoll,
                UIActivity.ActivityType.postToFlickr,
                UIActivity.ActivityType.postToVimeo,
                UIActivity.ActivityType.postToTencentWeibo
            ]

            self.present(activityViewController, animated: true, completion: nil)
        }
    }

    func createExportString() -> String {
        var itemIDvar: NSNumber?
        var productNamevar: String?
        var amountvar: NSNumber?
        var stockvar: Bool?

        var export: String = NSLocalizedString("itemID, productName, Amount \n", comment: "")
        for (index, itemList) in fetchedStatsArray.enumerated() {
            if index <= fetchedStatsArray.count - 1 {
                itemIDvar = itemList.value(forKey: "itemID") as! NSNumber?
                productNamevar = itemList.value(forKey: "productname") as! String?
                amountvar = itemList.value(forKey: "amount") as! NSNumber?
                stockvar = itemList.value(forKey: "stock") as! Bool?
                let inventoryDatevar = itemList.value(forKey: "inventoryDate") as! Date
                let itemIDString = itemIDvar
                let procductNameSting = productNamevar
                let amountSting = amountvar
                let stockSting = stockvar
                let inventoryDateSting = "\(inventoryDatevar)"
                export += "\(itemIDString!),\(procductNameSting!),\(stockSting!),\(amountSting!),\(inventoryDateSting) \n"
            }
        }
        print("This is what the app will export: \(export)")
        return export
    }   
}
导入UIKit
导入CoreData
类ViewController:UIViewController{
var itemid=178
var nametext=“Jones3”
var amountDouble=68
var inventoryDate:日期?=日期()
var stockStatus=true
var FETCHEDTSTATSARRAY:[NSManagedObject]=[]
让context=CoreDataStack.context
重写func viewDidLoad(){
super.viewDidLoad()
//这将在每次运行应用程序时添加新记录
storeTranscription()
//加载当前数据
getTranscriptions()
}
@iAction func exportButton(\发送方:UIButton){
exportDatabase()
}
func{
//检索我们刚刚创建的实体
让entity=NSEntityDescription.entity(forEntityName:“ItemList”,在:context中)
将transc=NSManagedObject(entity:entity!,insertInto:context)设为!ItemList
//设置实体值
transc.itemID=Double(itemID)
transc.productname=nametext
交易金额=双倍(金额双倍)
transc.stock=stockStatus
transc.inventoryDate=inventoryDate
//保存对象
做{
尝试context.save()
打印(“已保存!”)
}将let错误捕获为NSError{
打印(“无法保存\(错误),\(错误.用户信息)”)
}抓住{
}
}
func getTranscriptions(){
//创建一个获取请求,告诉它有关实体的信息
let fetchRequest:NSFetchRequest=ItemList.fetchRequest()
做{
//去看看结果
让searchResults=try context.fetch(fetchRequest)
fetchedStatsArray=搜索结果为[NSManagedObject]
//我喜欢检查返回结果的大小!
打印(“结果数=\(searchResults.count)”)
//您需要转换为NSManagedObject才能使用“for”循环
用于将搜索结果转换为[NSManagedObject]{
//获取键值对(尽管可能有更好的方法。。。
打印(\(trans.value(forKey:productname)!)
让mdate=trans.value(forKey:“inventoryDate”)作为!日期
打印(mdate)
}
}抓住{
打印(“请求错误:\(错误)”)
}
}
func exportDatabase(){
让exportString=createExportString()
保存和导出(导出字符串:导出字符串)
}
func saveAndExport(导出字符串:字符串){
让exportFilePath=NSTemporaryDirectory()+“itemlist.csv”
让exportFileURL=NSURL(fileURLWithPath:exportFilePath)
FileManager.default.createFile(atPath:exportFilePath,内容:NSData()作为数据,属性:nil)
//var fileHandleError:NSError?=nil
var fileHandle:fileHandle?=nil
做{
fileHandle=try fileHandle(forWritingTo:exportFileURL作为URL)
}抓住{
打印(“文件句柄错误”)
}
如果fileHandle!=nil{
fileHandle!.seekToEndOfFile()
让csvData=exportString.data(使用:String.Encoding.utf8,allowLossyConversion:false)
fileHandle!.write(csvData!)
fileHandle!.closeFile()文件
让firstActivityItem=NSURL(fileURLWithPath:exportFilePath)
让activityViewController:UIActivityViewController=UIActivityViewController(
activityItems:[firstActivityItem],应用程序活动:无)
activityViewController.excludedActivityTypes=[
UIActivity.ActivityType.assignToContact,
UIActivity.ActivityType.saveToCameraRoll,
UIActivity.ActivityType.PostToflicker,
UIActivity.ActivityType.postToVimeo,
UIActivity.ActivityType.postToTencentWeibo
]
self.present(activityViewController,动画:true,完成:nil)
}
}
func createExportString()->String{
var itemIDvar:NSNumber?
var PRODUCTNAME var:字符串?
var数量var:NSNumber?
瓦尔:布尔?
变量导出:String=NSLocalizedString(“itemID,productName,Amount\n”,注释:“”)
对于fetchedStatsArray.enumerated()中的(索引、项列表){

如果索引这是我用于Swift 4.2的解决方案

更新以匹配存储库中的代码。

import UIKit
import CoreData

class ViewController: UIViewController {

    var itemid = 178
    var nametext = "Jones3"
    var amountDouble = 68
    var inventoryDate: Date? = Date()
    var stockStatus = true
    var fetchedStatsArray: [NSManagedObject] = []
    let context = CoreDataStack.context

    override func viewDidLoad() {
        super.viewDidLoad()
        // This add a new record every time the app is run
        storeTranscription()
        // Loads the current data
        getTranscriptions()
    }

    @IBAction func exportButton(_ sender: UIButton) {
        exportDatabase()
    }

    func storeTranscription() {
        //retrieve the entity that we just created
        let entity =  NSEntityDescription.entity(forEntityName: "ItemList", in: context)
        let transc = NSManagedObject(entity: entity!, insertInto: context) as! ItemList

        //set the entity values
        transc.itemID = Double(itemid)
        transc.productname = nametext
        transc.amount = Double(amountDouble)
        transc.stock = stockStatus
        transc.inventoryDate = inventoryDate

        //save the object
        do {
            try context.save()
            print("saved!")
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        } catch {

        }
    }

    func getTranscriptions () {
        //create a fetch request, telling it about the entity
        let fetchRequest: NSFetchRequest<ItemList> = ItemList.fetchRequest()

        do {
            //go get the results
            let searchResults = try context.fetch(fetchRequest)
            fetchedStatsArray = searchResults as [NSManagedObject]
            //I like to check the size of the returned results!
            print ("num of results = \(searchResults.count)")
            //You need to convert to NSManagedObject to use 'for' loops
            for trans in searchResults as [NSManagedObject] {
                //get the Key Value pairs (although there may be a better way to do that...
                print("\(trans.value(forKey: "productname")!)")
                let mdate = trans.value(forKey: "inventoryDate") as! Date
                print(mdate)
            }

        } catch {
            print("Error with request: \(error)")
        }
    }

    func exportDatabase() {
        let exportString = createExportString()
        saveAndExport(exportString: exportString)
    }

    func saveAndExport(exportString: String) {
        let exportFilePath = NSTemporaryDirectory() + "itemlist.csv"
        let exportFileURL = NSURL(fileURLWithPath: exportFilePath)
        FileManager.default.createFile(atPath: exportFilePath, contents: NSData() as Data, attributes: nil)
        //var fileHandleError: NSError? = nil
        var fileHandle: FileHandle? = nil
        do {
            fileHandle = try FileHandle(forWritingTo: exportFileURL as URL)
        } catch {
            print("Error with fileHandle")
        }

        if fileHandle != nil {
            fileHandle!.seekToEndOfFile()
            let csvData = exportString.data(using: String.Encoding.utf8, allowLossyConversion: false)
            fileHandle!.write(csvData!)

            fileHandle!.closeFile()

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

            activityViewController.excludedActivityTypes = [
                UIActivity.ActivityType.assignToContact,
                UIActivity.ActivityType.saveToCameraRoll,
                UIActivity.ActivityType.postToFlickr,
                UIActivity.ActivityType.postToVimeo,
                UIActivity.ActivityType.postToTencentWeibo
            ]

            self.present(activityViewController, animated: true, completion: nil)
        }
    }

    func createExportString() -> String {
        var itemIDvar: NSNumber?
        var productNamevar: String?
        var amountvar: NSNumber?
        var stockvar: Bool?

        var export: String = NSLocalizedString("itemID, productName, Amount \n", comment: "")
        for (index, itemList) in fetchedStatsArray.enumerated() {
            if index <= fetchedStatsArray.count - 1 {
                itemIDvar = itemList.value(forKey: "itemID") as! NSNumber?
                productNamevar = itemList.value(forKey: "productname") as! String?
                amountvar = itemList.value(forKey: "amount") as! NSNumber?
                stockvar = itemList.value(forKey: "stock") as! Bool?
                let inventoryDatevar = itemList.value(forKey: "inventoryDate") as! Date
                let itemIDString = itemIDvar
                let procductNameSting = productNamevar
                let amountSting = amountvar
                let stockSting = stockvar
                let inventoryDateSting = "\(inventoryDatevar)"
                export += "\(itemIDString!),\(procductNameSting!),\(stockSting!),\(amountSting!),\(inventoryDateSting) \n"
            }
        }
        print("This is what the app will export: \(export)")
        return export
    }   
}
导入UIKit
导入CoreData
类ViewController:UIViewController{
var itemid=178
var nametext=“Jones3”
var amountDouble=68
var inventoryDate:日期?=日期()
var stockStatus=true
var FETCHEDTSTATSARRAY:[NSManagedObject]=[]
让context=CoreDataStack.context
重写func viewDidLoad(){
super.viewDidLoad()
//这将在每次运行应用程序时添加新记录
storeTranscription()
//加载当前数据
getTranscriptions()
}
@iAction func exportButton(\发送方:UIButton){
exportDatabase()
}
func{
//检索我们刚刚创建的实体
让entity=NSEntityDescription.entity(forEntityName:“ItemList”,在:context中)
将transc=NSManagedObject(entity:entity!,insertInto:context)设为!ItemList
//设置实体值
    do {
        let results = try context.execute(fetchRequest)
    }
    catch {
        print(error)
    }
import UIKit
import CoreData

class ViewController: UIViewController {

    var itemid = 178
    var nametext = "Jones3"
    var amountDouble = 68
    var inventoryDate: Date? = Date()
    var stockStatus = true
    var fetchedStatsArray: [NSManagedObject] = []
    let context = CoreDataStack.context

    override func viewDidLoad() {
        super.viewDidLoad()
        // This add a new record every time the app is run
        storeTranscription()
        // Loads the current data
        getTranscriptions()
    }

    @IBAction func exportButton(_ sender: UIButton) {
        exportDatabase()
    }

    func storeTranscription() {
        //retrieve the entity that we just created
        let entity =  NSEntityDescription.entity(forEntityName: "ItemList", in: context)
        let transc = NSManagedObject(entity: entity!, insertInto: context) as! ItemList

        //set the entity values
        transc.itemID = Double(itemid)
        transc.productname = nametext
        transc.amount = Double(amountDouble)
        transc.stock = stockStatus
        transc.inventoryDate = inventoryDate

        //save the object
        do {
            try context.save()
            print("saved!")
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        } catch {

        }
    }

    func getTranscriptions () {
        //create a fetch request, telling it about the entity
        let fetchRequest: NSFetchRequest<ItemList> = ItemList.fetchRequest()

        do {
            //go get the results
            let searchResults = try context.fetch(fetchRequest)
            fetchedStatsArray = searchResults as [NSManagedObject]
            //I like to check the size of the returned results!
            print ("num of results = \(searchResults.count)")
            //You need to convert to NSManagedObject to use 'for' loops
            for trans in searchResults as [NSManagedObject] {
                //get the Key Value pairs (although there may be a better way to do that...
                print("\(trans.value(forKey: "productname")!)")
                let mdate = trans.value(forKey: "inventoryDate") as! Date
                print(mdate)
            }

        } catch {
            print("Error with request: \(error)")
        }
    }

    func exportDatabase() {
        let exportString = createExportString()
        saveAndExport(exportString: exportString)
    }

    func saveAndExport(exportString: String) {
        let exportFilePath = NSTemporaryDirectory() + "itemlist.csv"
        let exportFileURL = NSURL(fileURLWithPath: exportFilePath)
        FileManager.default.createFile(atPath: exportFilePath, contents: NSData() as Data, attributes: nil)
        //var fileHandleError: NSError? = nil
        var fileHandle: FileHandle? = nil
        do {
            fileHandle = try FileHandle(forWritingTo: exportFileURL as URL)
        } catch {
            print("Error with fileHandle")
        }

        if fileHandle != nil {
            fileHandle!.seekToEndOfFile()
            let csvData = exportString.data(using: String.Encoding.utf8, allowLossyConversion: false)
            fileHandle!.write(csvData!)

            fileHandle!.closeFile()

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

            activityViewController.excludedActivityTypes = [
                UIActivity.ActivityType.assignToContact,
                UIActivity.ActivityType.saveToCameraRoll,
                UIActivity.ActivityType.postToFlickr,
                UIActivity.ActivityType.postToVimeo,
                UIActivity.ActivityType.postToTencentWeibo
            ]

            self.present(activityViewController, animated: true, completion: nil)
        }
    }

    func createExportString() -> String {
        var itemIDvar: NSNumber?
        var productNamevar: String?
        var amountvar: NSNumber?
        var stockvar: Bool?

        var export: String = NSLocalizedString("itemID, productName, Amount \n", comment: "")
        for (index, itemList) in fetchedStatsArray.enumerated() {
            if index <= fetchedStatsArray.count - 1 {
                itemIDvar = itemList.value(forKey: "itemID") as! NSNumber?
                productNamevar = itemList.value(forKey: "productname") as! String?
                amountvar = itemList.value(forKey: "amount") as! NSNumber?
                stockvar = itemList.value(forKey: "stock") as! Bool?
                let inventoryDatevar = itemList.value(forKey: "inventoryDate") as! Date
                let itemIDString = itemIDvar
                let procductNameSting = productNamevar
                let amountSting = amountvar
                let stockSting = stockvar
                let inventoryDateSting = "\(inventoryDatevar)"
                export += "\(itemIDString!),\(procductNameSting!),\(stockSting!),\(amountSting!),\(inventoryDateSting) \n"
            }
        }
        print("This is what the app will export: \(export)")
        return export
    }   
}