我最近为我在iOS中开发的iOS应用程序实现了AWS开发工具包。我已经连接到数据库实例并能够获得查询响应,但是,我正在努力将其转换为可用数据。我对Swift,AWS和编程一般还是比较陌生,因此可能缺少明显的东西!
我的代码如下:
let atVal = AWSDynamoDBAttributeValue() atVal.S = "123456abc" let condition = AWSDynamoDBCondition() condition.comparisonOperator = AWSDynamoDBComparisonOperator.EQ condition.attributeValueList = [atVal] let myDic: [String: AWSDynamoDBCondition] = ["userid": condition] let query = AWSDynamoDBQueryInput() query.indexName = "userid-index" query.tableName = "users" query.keyConditions = myDic query.limit = 1 dynamoDB.query(query).continueWithBlock { (task: BFTask!) -> AnyObject! in let results = task.result as AWSDynamoDBQueryOutput let myResults = results.items println("object: \(myResults.description)") return nil }
控制台输出为:
对象:[{area =“ {\ n S = \” West Hampstead \“; \ n}”; name =“ {\ n S = \” Olly Mayes \“; \ n}”; userid =“ {\ n S = \” 123456abc \“; \ n}”; }]
可以理解,使用AWS和Swift似乎没有太多的优先次序,因此,任何帮助将不胜感激!
您的问题的简单答案是:将返回的JSON字符串转换为Dictionary对象。像这样的东西:
let data = jsonDataItem.dataUsingEncoding(NSUTF8StringEncoding) if data != nil { var error : NSError? let dict = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: &error) as? NSDictionary if let e = error { ... } else { ... }
但是,我强烈建议您看一下更高级别的DynamoDB映射器类。使用DynamoDB映射器类时,您可以定义数据结构,并将其交给DynamoDB Mapper即可。这是一个完整的示例,从表创建到表删除。该示例使用DynamoDB Mapper插入,删除,扫描和查询表。
首先,您需要初始化客户端SDK
let cp = AWSStaticCredentialsProvider(accessKey: "AK...", secretKey: "xxx") let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: cp) AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(configuration)
这只是一个示例。在代码中嵌入访问密钥和秘密密钥不是一个好习惯。最佳实践是改用AWSCognitoCredentialsProvider(有关Cognito的更多信息)。
定义一个映射表中项目的类
class Item : AWSDynamoDBModel, AWSDynamoDBModeling { var email : String = "" var date : String = "" var note : String = "" var number : Double = 0.0 override init!() { super.init() } required init!(coder: NSCoder!) { fatalError("init(coder:) has not been implemented") } class func dynamoDBTableName() -> String! { return "Demo" } class func hashKeyAttribute() -> String! { return "email" } class func rangeKeyAttribute() -> String! { return "date" } //required to let DynamoDB Mapper create instances of this class override init(dictionary dictionaryValue: [NSObject : AnyObject]!, error: NSErrorPointer) { super.init(dictionary: dictionaryValue, error: error) } //workaround to possible XCode 6.1 Bug : "Type NotificationAck" does not conform to protocol "NSObjectProtocol" override func isEqual(anObject: AnyObject?) -> Bool { return super.isEqual(anObject) } }
创建表格
self.createTable().continueWithSuccessBlock {(task: BFTask!) -> BFTask! in NSLog("Create table - success") return nil } func createTable() -> BFTask! { let pt = AWSDynamoDBProvisionedThroughput() pt.readCapacityUnits = 10 pt.writeCapacityUnits = 10 let emailAttr = AWSDynamoDBAttributeDefinition() emailAttr.attributeName = "email" emailAttr.attributeType = AWSDynamoDBScalarAttributeType.S let dateAttr = AWSDynamoDBAttributeDefinition() dateAttr.attributeName = "date" dateAttr.attributeType = AWSDynamoDBScalarAttributeType.S let emailKey = AWSDynamoDBKeySchemaElement() emailKey.attributeName = "email" emailKey.keyType = AWSDynamoDBKeyType.Hash let dateKey = AWSDynamoDBKeySchemaElement() dateKey.attributeName = "date" dateKey.keyType = AWSDynamoDBKeyType.Range let ct = AWSDynamoDBCreateTableInput() ct.tableName = "Demo" ct.provisionedThroughput = pt ct.attributeDefinitions = [emailAttr, dateAttr] ct.keySchema = [ emailKey, dateKey ] NSLog("Creating table") let client = AWSDynamoDB.defaultDynamoDB() return client.createTable(ct) }
删除表格
self.deleteTable().continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in NSLog("Delete table - success") return nil }) func deleteTable() -> BFTask! { let dt = AWSDynamoDBDeleteTableInput() dt.tableName = "Demo" NSLog("Deleting table") let client = AWSDynamoDB.defaultDynamoDB() return client.deleteTable(dt) }
插入项目
self.insertSomeItems().continueWithBlock({ (task: BFTask!) -> BFTask! in if (task.error != nil) { NSLog(task.error.description) } else { NSLog("DynamoDB save succeeded") } return nil; }) func insertSomeItems() -> BFTask! { let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() var item = Item() item.email = "stormacq@amazon.com" item.date = "20141101" item.note = "This is item #1" item.number = 1.0 let task1 = mapper.save(item) item = Item() item.email = "stormacq@amazon.com" item.date = "20141102" item.note = "This is item #2" item.number = 2.0 let task2 = mapper.save(item) item = Item() item.email = "stormacq@amazon.lu" item.date = "20141103" item.note = "This is item #3" item.number = 3.0 let task3 = mapper.save(item) return BFTask(forCompletionOfAllTasks: [task1, task2, task3]) }
装载一件物品
self.load("stormacq@amazon.com", range:"20141101").continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in NSLog("Load one value - success") let item = task.result as Item print(item) return nil }) func load(hash: String, range: String) -> BFTask! { let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() return mapper.load(Item.self, hashKey: hash, rangeKey: range) }
查询哈希和范围键
/* keyConditions http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSDynamoDBQueryInput.html#//api/name/keyConditions */ let cond = AWSDynamoDBCondition() let v1 = AWSDynamoDBAttributeValue(); v1.S = "20141101" cond.comparisonOperator = AWSDynamoDBComparisonOperator.EQ cond.attributeValueList = [ v1 ] let c = [ "date" : cond ] self.query("stormacq@amazon.com", keyConditions:c).continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in NSLog("Query multiple values - success") let results = task.result as AWSDynamoDBPaginatedOutput for r in results.items { print(r) } return nil }) func query(hash: String, keyConditions:[NSObject:AnyObject]) -> BFTask! { let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() let exp = AWSDynamoDBQueryExpression() exp.hashKeyValues = hash exp.rangeKeyConditions = keyConditions return mapper.query(Item.self, expression: exp) }
扫描项目(全表扫描)
let cond = AWSDynamoDBCondition() let v1 = AWSDynamoDBAttributeValue(); v1.S = "20141101" cond.comparisonOperator = AWSDynamoDBComparisonOperator.GT cond.attributeValueList = [ v1 ] let exp = AWSDynamoDBScanExpression() exp.scanFilter = [ "date" : cond ] self.scan(exp).continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in NSLog("Scan multiple values - success") let results = task.result as AWSDynamoDBPaginatedOutput for r in results.items { print(r) } return nil }) func scan(expression : AWSDynamoDBScanExpression) -> BFTask! { let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() return mapper.scan(Item.self, expression: expression) }
如果在美国EAST 1中没有其他DynamoDB用法,那么运行此示例不会带来任何成本,因为它属于DynamoDB的免费层。