To query items in a DynamoDB using swift.
(I will be using the example based here, translated to use swift). You can find the source files here: Github
Here is what my table looks like in aws:
You first have to define a Mapping Class. Basically this is where you define what values from the table you need to get:
//class that gets the objects from db class DDBTableRow :AWSDynamoDBObjectModel ,AWSDynamoDBModeling { var ISBN:String? var Title:String? var Author:String? class func dynamoDBTableName() -> String! { return "Books" } // if we define attribute it must be included when calling it in function testing... class func hashKeyAttribute() -> String! { return "ISBN" } class func ignoreAttributes() -> Array<AnyObject>! { return nil } //MARK: NSObjectProtocol hack //Fixes Does not conform to the NSObjectProtocol error override func isEqual(object: AnyObject?) -> Bool { return super.isEqual(object) } override func `self`() -> Self { return self } }
Once you have the class implementation, then you can begin the querying. Here I created a function called getQuery the returns the values:
func getQuery(){ //performing a query //first create expression let queryExpression = AWSDynamoDBQueryExpression() //second define the index name queryExpression.indexName = "Author-index" //3rd hashes queryExpression.hashKeyAttribute = "Author" queryExpression.hashKeyValues = ("Jose Deras") //putting it all together let dynamoDBObjectMapper2 = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() dynamoDBObjectMapper2.query(DDBTableRow.self, expression: queryExpression) .continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task:AWSTask!) -> AnyObject! in if (task.error == nil) { if (task.result != nil) { NSLog("Somthing happened") //starting the output of data let tableRow = task.result as! AWSDynamoDBPaginatedOutput for (items) in tableRow.items { print("\(items.ISBN)") print("\(items.Title)") print("\(items.Author)") } } } else { print("Error: \(task.error)") } return nil }) }
If you get this error message:
session task failed with error: Error Domain=NSURLErrorDomain Code=-1200 “An SSL error has occurred and a secure connection to the server cannot be made.” UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7fbcb38103c0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 “(null)” UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://dynamodb.us-east-1.amazonaws.com/, NSErrorFailingURLStringKey=https://dynamodb.us-east-1.amazonaws.com/, _kCFStreamErrorDomainKey=3}
Add the following to info.plist:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Adding this disables App transport security that was implemented in iOS9. See more info here.
thanks for posting this. swift, ftw!
Thanks for this!! Really helped me!!
Is there a way to ask you for a tutorial? Since they have made the Cognito Beta, all the swift examples that they provide doesn’t work, because now, Cognito uses User Pools.
Is there a way you to post a very simple tutorial where you show how to login via facebook and cognito?
I would really appreciate it…
thanks for the tutorial, way better than the one up on aws.
Thank you!!!!
I am getting this error
dispatch_once(predicate, block); signal sigabrt
libc++abi.dylib: terminating with uncaught exception of type NSException..
I dont know whats happening.