Swift DynamoDB Mapper发送空值

时间:2017-09-29 16:28:53

标签: swift amazon-web-services amazon-dynamodb aws-sdk aws-cognito

我尝试使用iOS Swift SDK来使用DynamoDB。我使用Cognito和Facebook作为外部身份提供商。 Cognito工作正常 - 我已经测试过用户同步并且工作正常,所以我相信我已经设置了身份验证。以下是我设置SDK的方式(我的代码中包含了我的身份池的实际值):

let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast1,
                                                          identityPoolId:"<my-identity-pool-id>", identityProviderManager: FacebookProvider())

    let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider)
    AWSServiceManager.default().defaultServiceConfiguration = configuration

这是我的DynamoDB映射类:

import Foundation
import AWSDynamoDB

class SavedItem : AWSDynamoDBObjectModel, AWSDynamoDBModeling {

    var userId : Int?
    var timestamp : Int?

    class func dynamoDBTableName() -> String {
        return "my-table"
    }

    class func hashKeyAttribute() -> String {
         return "userId"
    }

    class func rangeKeyAttribute() -> String {
        return "timestamp"
    }
  }

我已经验证我的代码具有正确的表和属性名称,并且表中的哈希键和范围键值与SavedItem类中的字段相同,包括区分大小写。

以下是我如何实例化映射器:

let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()

let savedItem = SavedItem()
savedItem?.userId = 1
savedItem?.timestamp = 2

dynamoDBObjectMapper.save(savedItem!).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in
    if let error = task.error as? NSError {
        print("The request failed. Error: \(error)")
    } else {
        print("Save callback executing")
    }

    return nil
})

该代码或多或少直接来自AWS Documentation示例。但是,这是代码执行时我在控制台中得到的内容:

Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=0 "(null)" UserInfo={__type=com.amazon.coral.validate#ValidationException, message=Supplied AttributeValue is empty, must contain exactly one of the supported datatypes}

我将控制台记录提升到调试状态,看起来映射器没有从SavedItem对象发送任何属性。这是save请求正文的控制台中的内容:

Request body:
{"Key":{"userId":{},"timestamp":{}},"TableName":"my-table","AttributeUpdates":{}}

知道为什么这些值没有包含在保存请求正文中吗?

在iOS 11上的Swift 4中使用aws-sdk-ios v2.6.1。

2 个答案:

答案 0 :(得分:0)

问题似乎是userIdtimestamp的类型。将它们从Int更改为NSNumber可解决问题。

答案 1 :(得分:-3)

是的,我遇到了同样的问题。经过3天的努力。我发现AWSDynamoDBObjectModel不支持swift 4.请试试swift 3版本。你会获得成功。