如何从MongoDB存储和检索Swift数据或NSData?

时间:2016-11-24 14:46:24

标签: swift mongodb mongoose

我想在MongoDB中存储Data对象:

它是使用CryptoSwift创建的

let bytes = dataString.utf8.map({$0})
let encrypted = try! ChaCha20(key: getAESP(), iv: "zzzzzzzzzzzzzz").encrypt(bytes)
let encryptedData = Data(bytes: encrypted)

使用NSURLSession发送到服务器:

let postData = NSMutableData(data: "patient_id=\(patientID)".data(using: String.Encoding.utf8)!)
postData.append("&data=".data(using: String.Encoding.utf8)!)
postData.append(encryptedData)        
let request = NSMutableURLRequest(url: NSURL(string: "\(url)api/patient/document")! as URL,
                                          cachePolicy: .useProtocolCachePolicy,
                                          timeoutInterval: 10.0)

在我的模型方案中,我将数据描述为缓冲区:

var DocumentSchema1 = new Schema({
        created_at:Date,
        created_by:String,
        document_type:String,
        document_name:String,
        data: Buffer,
        modifications: [
            {
                modified_by: String,
                modified_at: Date,
                data: Buffer
            }
        ],
        isDeleted: Boolean,
        deleted_at: String,
        deleted_by: String,
  })

这种方法的问题是从Web服务返回的JSON是一种缓冲区而不是Data,下面的Swift条件永远不会被执行。

  if let dataString = dict["data"] as? Data{

问题是如何从Mongo中获取二进制数据并在Swift中使用它?

EDIT2:根据zaph的回答: 因此数据为__NSArrayI,其元素为Int64(35) 我可以投射的唯一方法是Array<AnyObject>,但我无法将其转换为给定此表单的数据。

试图将其投射到:

  • Array<Int64>
  • [UINT64]
  • [UINT8]
  • [Int64类型]
  • UnsafeRawPointer

失败。

 if let a = dataDict["data"] as? Array<Int64> 

1 个答案:

答案 0 :(得分:0)

假设dataString是一个名字错误的字节数组:

let dataString :[UInt8] = [0x41, 0x42, 0x43, 0x44]
print("dataString: \(dataString)")
let data =  Data(bytes:dataString, count:4)
print("data: \(data)")
print("data as hexadecimal: \(data.map { String(format: "%02hhx", $0) }.joined())")
  

输出:

dataString: [65, 66, 67, 68]
data: 4 bytes
data as hexadecimal: 41424344