首页 > 解决方案 > 由于 fetchedstatsarray 为空,我的 CSV 未完全生成,但为什么我的 fetchedstatsarray 为空?

问题描述

我有一个应用程序接收存储在核心数据中的用户输入。为了简化事情,我将用户输入的 5 个字符串组合在一起,用逗号分隔,然后这个长字符串作为 1 个实体存储在核心数据中。逗号分隔各个“字符串”是使其成为 CSV 的原因。但是,当我尝试导出 csv 文件时,我只设法获取了标题。

在此处输入图像描述

其中涉及的两个代码组件如下。收集字符串并组合它们的部分:

@objc func addAlarmItem(_ sender: AnyObject) {
        let alertController = UIAlertController(title: "Add New Item", message: "Please fill in the blanks", preferredStyle: .alert)
        let saveAction = UIAlertAction(title: "Save", style: .default) { [unowned self] action in

            //combined string of attributes
            let myStrings: [String] = alertController.textFields!.compactMap { $0.text }
            let myText = myStrings.joined(separator: ",")

            self.save(myText)
            self.tableView.reloadData()
        }

        let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: nil)

        alertController.addTextField { (textField) in
            textField.placeholder = "Enter Name of Engineer"
        }
        alertController.addTextField { (textField) in
            textField.placeholder = "Enter Date of Alarm in DD/MM/YYYY"
        }
        alertController.addTextField { (textField) in
            textField.placeholder = "Enter Time of Alarm in 24h (eg: 2300)"
        }
        alertController.addTextField { (textField) in
            textField.placeholder = "Please indicate True/False (type True or False)"
        }
        alertController.addTextField { (textField) in
            textField.placeholder = "Insert comments (if any), or NIL"
        }

    func save(_ itemName: String) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedContext = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "AlarmItem", in: managedContext)!
        let item = NSManagedObject(entity: entity, insertInto: managedContext)
        item.setValue(itemName, forKey: "alarmAttributes")

        do {
            try managedContext.save()
            tableView.reloadData()

        } catch let err as NSError {
            print("Failed to save an item", err)
        }
    }

以及将核心数据输入为 csv 的部分:

    @objc func exportCSV(_ sender: AnyObject) {
        exportDatabase()
    }

    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 fileHandle: FileHandle? = nil

        do {
            fileHandle = try FileHandle(forUpdating: exportFileUrl as URL)
        } catch {
            print("filehandle has error")
        }

        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
            ]
            activityViewController.popoverPresentationController?.sourceView = self.view


 activityViewController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
            activityViewController.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
            self.present(activityViewController, animated: true, completion: nil)
        }
    }

    func createExportString() -> String {
        var alarmAttributes: String?
        var export: String = NSLocalizedString("Engineer Name,Date of Alarm,Time of Alarm,True or False,Engineer Comments \n", comment: "")

        for (index, AlarmItem) in fetchedStatsArray.enumerated() {
            if index <= fetchedStatsArray.count - 1 {
                alarmAttributes = AlarmItem.value(forKey: "alarmAttributes") as! String?
                let alarmAttributeStrings = alarmAttributes
                export += "\(alarmAttributeStrings ?? "0") \n"
            }
        }
        print("the app will now print: \(export) ")
        return export
    }

我一生都无法弄清楚为什么我的 fetchedStatsArray 是空的。我已附加到我的 github 中的整个代码。

完整代码位于此处:https ://github.com/danialaqil/TFAApp/blob/master/AlarmChartsApp/HistoryController.swift如果您需要更详细地查看整个内容

标签: iosswiftcsv

解决方案


推荐阅读