1

まず、DynamoDB で達成しようとしていること:

-> (ログインシステムのスキャンフィルターにユーザー名とパスワードを含めようとしています。したがって、電子メール/ユーザーとパスワードの組み合わせの場合、オブジェクトscanを返すメソッド、そうでない場合はログインが成功します。)AWSDynamoDBObjectMapper

何がうまくいかないのですか?

これについてGithubのドキュメントとサンプル コードを読み込もうとしましたが、適切な使用例はないようです。scanFilterドキュメントから、タイプ NSDictionary であることがわかりました。そのため、フィルタリング用に複数のパラメーターを含めようとしました ( UserName/UserEmail and Password) が、結果のスキャンに失敗しています。

 scanExpression.scanFilter = @{@"Password": passwordCondition, UserNameOrUserEmail : usernameOrEmailCondition};

ただし、パラメーターを 1 つだけ渡すと、機能してオブジェクトが返されます。つまり、データベースの行が返されます。

scanExpression.scanFilter = @{@"Password": passwordCondition};

参照用の完全なコード (Android を使用している同僚に言及したところ、Android 用の同様のコードは正常に動作します):

// Check if email or username and decide DynamoDB Attribute accordingly.
NSString *UserNameOrUserEmail;   
if ([usernameOrEmail rangeOfString:@"@"].location == NSNotFound) 
    UserNameOrUserEmail = @"UserName";
else
    UserNameOrUserEmail = @"UserEmail";

AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];

AWSDynamoDBCondition *passwordCondition = [AWSDynamoDBCondition new];
AWSDynamoDBAttributeValue *passwordAttribute = [AWSDynamoDBAttributeValue new];
passwordAttribute.S = password;
passwordCondition.attributeValueList = @[passwordAttribute];
passwordCondition.comparisonOperator = AWSDynamoDBComparisonOperatorEQ;

AWSDynamoDBCondition *usernameOrEmailCondition = [AWSDynamoDBCondition new];
AWSDynamoDBAttributeValue *usernameOrEmailAttribute = [AWSDynamoDBAttributeValue new];
usernameOrEmailAttribute.S = @"sammy@hhd.com";//usernameOrEmail;
usernameOrEmailCondition.attributeValueList = @[usernameOrEmailAttribute];
usernameOrEmailCondition.comparisonOperator = AWSDynamoDBComparisonOperatorEQ;

//Apply filter condtions: http://stackoverflow.com/a/27856299/818506
scanExpression.scanFilter = @{@"Password": passwordCondition, UserNameOrUserEmail : usernameOrEmailCondition}; //@{@"UserEmail": usernameOrEmailCondition};//

 //^^^^^^^^^^^^^^^^^^^^^^^^^^^Is this correct?^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    

//Perform a scan:
[[dynamoDBObjectMapper scan:[User class] expression:scanExpression]continueWithBlock: ^id (AWSTask *task){

    if (task.error) {
        NSLog(@"The request failed. Error: [%@]", task.error);
    }
    if (task.exception) {
        NSLog(@"The request failed. Exception: [%@]", task.exception);
    }
    if (task.result) {
        AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
        for (User *user in paginatedOutput.items) {
            isLoginSuccessful = YES;
         }
        completionHandler(isLoginSuccessful);
    }
    return nil;
}];

提案/アイデア/コメントをいただければ幸いです。

ありがとう、ローハン。

4

2 に答える 2

1

と の使用を検討しAWSDynamoDBScanInputましたNSMutableDictionaryか? Swift には、Objective-C に変換するのがかなり簡単な次の例があります。

    // create password condition
    let passwordCondition = AWSDynamoDBCondition()
    let v1    = AWSDynamoDBAttributeValue(); v1.S = password
    passwordCondition.comparisonOperator = AWSDynamoDBComparisonOperator.EQ
    passwordCondition.attributeValueList = [ v1 ]

    // create username condition        
    let usernameCondition = AWSDynamoDBCondition()
    let v2    = AWSDynamoDBAttributeValue(); v2.S = "sammy@hhd.com"
    usernameCondition.comparisonOperator = AWSDynamoDBComparisonOperator.EQ
    usernameCondition.attributeValueList = [ v2 ]

    // add these conditions to a NSMutableDictionary
    var scanFilterDict : NSMutableDictionary! = NSMutableDictionary()
    scanFilterDict.addEntriesFromDictionary(["password": passwordCondition])
    scanFilterDict.addEntriesFromDictionary(["UserNameOrUserEmail": usernameCondition])

    // use the mutable dictionary as scan filter
    scanInput.scanFilter = scanFilterDict as Dictionary<NSObject, AnyObject>
    scanInput.exclusiveStartKey = self.lastEvaluatedKey
    scanInput.limit = 20
    scanInput.tableName = "yourDynamoDBTable"

    // apply AND operator on both conditions
    scanInput.conditionalOperator = AWSDynamoDBConditionalOperator.And

    AWSDynamoDB.defaultDynamoDB().scan(input)
于 2015-09-10T07:40:54.443 に答える