1

我正在编写一个程序,该程序读取手机中的传感器并将传感器数据保存到核心数据 SQLite 模型中,每组读数都与特定会话有关

该程序为用户提供了通过电子邮件发送特定会话的 .csv 文件的选项。

以前从未这样做过,我通过初始化委托和上下文来解决这个问题,并在核心数据中搜索与指定会话相关的实体。然后,满足会话属性的实体将读取其数据字段(gps、mag、accel、gyro)并将其放入字符串中。然后将字符串附加到数组中。一切都迅速完成。

搜索实体并创建数组后,我尝试创建一个 csv 文件作为电子邮件的附件。该文件已成功附加,但我的编码技术是在文件中显示附加数据。

我想在手机上保存一个文件并将副本通过电子邮件发送给用户。

在再次转换为 NSData 之前,我必须将 Array 更改为 NSArray:

    let paths: NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true);
    let path = paths[0].stringByAppendingPathComponent("SessionData.csv")

    if !NSFileManager.defaultManager().fileExistsAtPath(path)
    {
        NSFileManager.defaultManager().createFileAtPath(path, contents: nil, attributes: nil)
    }
    else
    {
        NSFileManager.defaultManager().createFileAtPath(path, contents: nil, attributes: nil)
    }

    var handle: NSFileHandle = NSFileHandle(forWritingAtPath: path)
    handle.truncateFileAtOffset(handle.seekToEndOfFile())
    var arrayToWriteNS = (arrayToWrite as NSArray)
    var dataNS: NSData = NSKeyedArchiver.archivedDataWithRootObject(arrayToWrite as NSArray)
    handle.writeData(dataNS)

    mc.setSubject(emailTitle)
    mc.addAttachmentData(dataNS, mimeType: "text/csv", fileName: "SessionData.csv")   

这是前置和附加的数据:

bplist00‘()T$topX$objectsX$versionY$archiver—TrootĨ    
!U$null“
V$classZNS.objectsÄ©ÄÄÄÄÄÄÄÄ    Ä

“我的数据”

 “"#$'X$classesZ$classname¢%&WNSArrayXNSObjectWNSArray܆_NSKeyedArchiver(25:<IOT[fhrtvxz|~ÄÇÑ·Ø}KÁµÉQV_jmu~Üã*ù 

在包含 28,000 个实体的大型数据会话中,可能有大约 750 行前置数据。

您可以提供的任何帮助将不胜感激。

我是 iOS、Obj-C 和 swift 的新手,因此我很肯定有更好的方法来做到这一点,只是我还没有找到更好的方法。

谢谢你。

更新:最终只使用 NSString 数据编码并以增量方式写入我的文件:

handle.truncateFileAtOffset(handle.seekToEndOfFile())
var stringToWriteNS = (stringToWrite as NSString).dataUsingEncoding(NSUTF8StringEncoding)
handle.writeData(stringToWriteNS!)
4

1 回答 1

0

您不需要 NSKeyedArchiver,它用于归档和恢复类。

您需要遍历数组并以您要呈现给用户的格式创建每个项目的文本表示。

快速搜索 CocoaPods 会发现几个可能适合您需要生成 csv 格式数据的项目。

可能是你需要的。

csv 相当简单,因此通过编写自己的代码将数据格式化为 csv 是合理的。

于 2014-09-02T03:18:19.443 回答