通过MFmail将iOS应用程序中的核心数据导出到CSV

通过MFmail将iOS应用程序中的核心数据导出到CSV,ios,swift,xcode,Ios,Swift,Xcode,我使用的核心数据是一个带有属性“who”、“reason”和“date”的“Checkins”实体“。我想将核心数据导出到csv并从MFmail附加/发送。我无法使导出到csv工作-当我单击发送邮件时,电子邮件生成器工作正常,但没有csv附件。。。未报告任何错误。任何帮助都将不胜感激 func configuredMailComposeViewController() -> MFMailComposeViewController { let df = DateFor

我使用的核心数据是一个带有属性“who”、“reason”和“date”的“Checkins”实体“。我想将核心数据导出到csv并从MFmail附加/发送。我无法使导出到csv工作-当我单击发送邮件时,电子邮件生成器工作正常,但没有csv附件。。。未报告任何错误。任何帮助都将不胜感激

func configuredMailComposeViewController() -> MFMailComposeViewController
    {
        let df = DateFormatter()
        df.dateFormat = "dd-MMM-yyyy"
        let now = df.string(from: Date())

        // Establish the controller from scratch
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self

        // Set preset information included in the email
        mailComposerVC.setSubject(now + " - Checkins")
        mailComposerVC.setMessageBody("\n", isHTML: false)

        // Turn core data for responses into a .csv file

        // Pull core data in
        let CoreDataResultsList = [NSManagedObject]()

        // Register the proper delegate and managed context
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        // Pull the data from core data

        do {
            let fetchRequest = NSFetchRequest<Checkins>(entityName: "Checkins")
            self.items = try context.fetch(fetchRequest)
            } catch {
            print("Cannot fetch Date")
            }
        
        // Take the managed object array and turn it into a .csv sring to write in the file
        // In doing this, we are writing just like we would to any string
        let csvString = writeCoreObjectsToCSV(objects: CoreDataResultsList)
        let data = csvString.data(using: String.Encoding.utf8.rawValue, allowLossyConversion: false)
        mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: "GenericFilename.csv")

        return mailComposerVC
    }

    // Takes a managed object and writes it to the .csv file ..?
    func writeCoreObjectsToCSV(objects: [NSManagedObject]) -> NSMutableString
    {
        // Make sure we have some data to export
        guard objects.count > 0 else
        {

            return ""
        }

        let mailString = NSMutableString()


        mailString.append("Generic Header 1, Generic Header 2, Generic Header 3")

        for object in objects
        {
            // Put "\n" at the beginning so you don't have an extra row at the end
            mailString.append("\n\(object.value(forKey: "who")!),\(object.value(forKey: "reason")!)")
        }
        return mailString
    }
    
func配置了mailcomposeviewcontroller()->MFMailComposeViewController
{
设df=DateFormatter()
df.dateFormat=“dd-MMM-yyyy”
现在让我们来看看df.string(from:Date())
//从头开始建立控制器
让mailComposerVC=MFMailComposeViewController()
mailComposerVC.mailComposeDelegate=self
//设置电子邮件中包含的预设信息
mailComposerVC.setSubject(现在+“-Checkins”)
MailComposer vc.setMessageBody(“\n”,isHTML:false)
//将响应的核心数据转换为.csv文件
//拉入核心数据
让CoreDataResultsList=[NSManagedObject]()
//注册适当的委托和托管上下文
让上下文=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
//从核心数据中提取数据
做{
let fetchRequest=NSFetchRequest(entityName:“签入”)
self.items=try context.fetch(fetchRequest)
}抓住{
打印(“无法获取日期”)
}
//获取托管对象数组并将其转换为.csv sring以写入文件
//在这样做的过程中,我们就像对任何字符串一样进行书写
让csvString=writecoreObject stocsv(对象:CoreDataResultsList)
让data=csvString.data(使用:String.Encoding.utf8.rawValue,allowossyconversion:false)
MailComposer vc.addAttachmentData(数据!mimeType:“text/csv”,文件名:“GenericFilename.csv”)
返回邮件
}
//获取托管对象并将其写入.csv文件。。?
func writeCoreObjectsToCSV(对象:[NSManagedObject])->NSMutableString
{
//确保我们有一些数据要导出
guard objects.count>0其他
{
返回“”
}
让mailString=NSMutableString()
append(“通用头1,通用头2,通用头3”)
对于对象中的对象
{
//将“\n”放在开头,这样结尾就不会有多余的一行
mailString.append(“\n\(object.value(forKey:who)!),\(object.value(forKey:reason)!”)
}
返回邮件字符串
}

正如Joakim所建议的,这些项目应该从self.items中检索,而不是像我以前那样从NSManagedObject中检索

错误的方式:

        // Pull core data in
        let CoreDataResultsList = [NSManagedObject]()
正确的方式:

        // Pull core data in
        let CoreDataResultsList = self.items

CoreDataResultsList始终为空数组(您的数据位于self.items中)。我建议您学习如何使用调试器,这在这里会有很大帮助。当然,感谢您的反馈-仍在学习,并将探索调试。编辑:只是重复你说的话,并立即解决问题。比我想象的要简单得多,但我只是一个初学者,所以我有很多东西要学。再次感谢!