我尝试使用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。
答案 0 :(得分:0)
问题似乎是userId
和timestamp
的类型。将它们从Int
更改为NSNumber
可解决问题。
答案 1 :(得分:-3)
是的,我遇到了同样的问题。经过3天的努力。我发现AWSDynamoDBObjectModel不支持swift 4.请试试swift 3版本。你会获得成功。