まず、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;
}];
提案/アイデア/コメントをいただければ幸いです。
ありがとう、ローハン。