简体   繁体   English

AWS DynamoDB批量获取请求 - iOS

[英]AWS DynamoDB Batch Get Request - iOS

I can perform a simple Get request on a singular table within AWS dynamoDB however when I expand it to a Batch Request across multiple tables I continue to get a error 我可以在AWS dynamoDB中的单个表上执行简单的Get请求,但是当我将它扩展到跨多个表的批处理请求时,我仍然会收到错误

validation error detected: Value null at 'requestItems.rip.member.keys' failed to satisfy constraint

I understand this as the values not being passed correctly but I can't see what the issue is with my code 我理解这是因为没有正确传递值,但我无法看到我的代码存在什么问题

//Create Request Values
AWSDynamoDBGetItemInput *getItem = [AWSDynamoDBGetItemInput new];
AWSDynamoDBAttributeValue *hashValue = [AWSDynamoDBAttributeValue new];
hashValue.S = @"User Test";
getItem.key = @{@"ripId": hashValue};

//Create Request Values 2 
AWSDynamoDBGetItemInput *getItem2 = [AWSDynamoDBGetItemInput new];
AWSDynamoDBAttributeValue *hashValue2 = [AWSDynamoDBAttributeValue new];
hashValue2.S = @"User Test";
getItem2.key = @{@"chat": hashValue2};

//Combine to Batch Request
AWSDynamoDBBatchGetItemInput * batchFetch = [AWSDynamoDBBatchGetItemInput new];
batchFetch.requestItems = @{ @"rip": getItem,
                             @"chat": getItem,};

[[dynamoDB batchGetItem:batchFetch] continueWithBlock:^id(BFTask *task) {
    if (!task.error) {

        NSLog(@"BOY SUCCES");

    } else {
        NSLog(@" NO BOY SUCCESS %@",task.error);
    }
    return nil;
}];

Searched the internet high and low but cannot see a working example of a batch request using iOS Objective C (or swift for that matter). 搜索了互联网的高低,但无法看到使用iOS Objective C(或swift)的批量请求的工作示例。

I have tested both variables on a single Get request and they both work. 我已在单个Get请求中测试了这两个变量,但它们都有效。

You forgot to wrap around AWSDynamoDBAttributeValue in AWSDynamoDBKeysAndAttributes . 您忘了在AWSDynamoDBAttributeValue中包装AWSDynamoDBKeysAndAttributes Here is a simple example from AWSDynamoDBTests.m : 以下是AWSDynamoDBTests.m中的一个简单示例:

AWSDynamoDBKeysAndAttributes *keysAndAttributes = [AWSDynamoDBKeysAndAttributes new];
keysAndAttributes.keys = @[@{@"hashKey" : attributeValue1},
                           @{@"hashKey" : attributeValue2}];
keysAndAttributes.consistentRead = @YES;

AWSDynamoDBBatchGetItemInput *batchGetItemInput = [AWSDynamoDBBatchGetItemInput new];
batchGetItemInput.requestItems = @{table1Name: keysAndAttributes};

Since the batch get doesn't map to a class I solved it by doing this instead. 由于批处理get没有映射到类,我通过这样做来解决它。

I solved it by doing this, 我解决了这个问题,

    let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper()
    let task1 = dynamoDBObjectMapper.load(User.self, hashKey: "rtP1oQ5DJG", rangeKey: nil)
    let task2 = dynamoDBObjectMapper.load(User.self, hashKey: "dbqb1zyUq1", rangeKey: nil)

    AWSTask.init(forCompletionOfAllTasksWithResults: [task1, task2]).continueWithBlock { (task) -> AnyObject? in
        if let users = task.result as? [User] {
            print(users.count)
            print(users[0].firstName)
            print(users[1].firstName)
        }
        else if let error = task.error {
            print(error.localizedDescription)
        }
        return nil
    }

Swift 3 斯威夫特3

I was able to get the BatchGet request work with the following code. 我能够使用以下代码获取BatchGet请求。 Hope this helps someone else who's struggling with the lack of Swift Docs. 希望这可以帮助那些正在努力应对Swift Docs缺乏的人。
  • This code assumes that you've configured your AWSServiceConfiguration in the AppDelegate application didFinishLaunchingWithOptions method. 此代码假定您已在AppDelegate应用程序didFinishLaunchingWithOptions方法中配置了AWSServiceConfiguration。

     let DynamoDB = AWSDynamoDB.default() // define your primary hash keys let hashAttribute1 = AWSDynamoDBAttributeValue() hashAttribute1?.s = "NDlFRTdDODEtQzNCOC00QUI5LUFFMzUtRkIyNTJFNERFOTBF" let hashAttribute2 = AWSDynamoDBAttributeValue() hashAttribute2?.s = "MjVCNzU3MUQtMEM0NC00NEJELTk5M0YtRTM0QjVDQ0Q1NjlF" let keys: Array = [["userID": hashAttribute1], ["userID": hashAttribute2]] let keysAndAttributesMap = AWSDynamoDBKeysAndAttributes() keysAndAttributesMap?.keys = keys as? [[String : AWSDynamoDBAttributeValue]] keysAndAttributesMap?.consistentRead = true let tableMap = ["Your-Table-Name" : keysAndAttributesMap] let request = AWSDynamoDBBatchGetItemInput() request?.requestItems = tableMap as? [String : AWSDynamoDBKeysAndAttributes] request?.returnConsumedCapacity = AWSDynamoDBReturnConsumedCapacity.total DynamoDB.batchGetItem(request!) { (output, error) in if output != nil { print("Batch Query output?.responses?.count:", output!.responses!) } if error != nil { print("Batch Query error:", error!) } } 
  • 声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM