私はモバイルアプリケーションのバックエンドデータベースとしてDynamoDBを使用していますが、スキーマなどはAndroid & iOSで同じです。特定のユースケースでは、インデックスが作成されていない2つの属性に基づいてスキャンを実行する必要があります。 iOS Objective Cでは、次のコードを使用しています:AWS DynamoDBスキャンはiOSで失敗しましたが、Androidで動作します
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
scanExpression.limit = [NSNumber numberWithInt:maxCount];
scanExpression.filterExpression = @"#l = :location AND event = :event";
scanExpression.expressionAttributeNames = @{@"#l":@"location"};
scanExpression.expressionAttributeValues = @{@":location":location,
@":event":EVENT_TASTING};
ロケーションとイベントの両方が文字列です。 EVENT_TASTINGは文字列定数です。私は結果を受け取る必要があります提供されたエントリのためにそれを検証していますが、このスキャンはゼロ結果を返し続けます。私はAndroid Javaで次のコードを使用します:
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
scanExpression.setLimit(maxCount);
scanExpression.addFilterCondition("location",
new Condition()
.withComparisonOperator(ComparisonOperator.EQ)
.withAttributeValueList(new AttributeValue().withS(location)));
scanExpression.addFilterCondition("event",
new Condition()
.withComparisonOperator(ComparisonOperator.EQ)
.withAttributeValueList(new AttributeValue().withS(Constants.EVENT_TASTING)));
Androidで期待通りに動作します。 iOSでそれを動作させるために何を変更する必要がありますか? iOS SDKを2.3.6にアップデートしましたが、違いはありませんでした。これは私のコードで行っている唯一のスキャン操作です。
iOSのscanExpressionにエラーはありますか? Androidスタイルの構文を使ってiOSでこの作業を行う方法はありますか?
更新
私は次のように変更しようとした:
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
AWSDynamoDBAttributeValue *locationVal = [AWSDynamoDBAttributeValue new];
locationVal.S = location;
AWSDynamoDBAttributeValue *eventVal = [AWSDynamoDBAttributeValue new];
eventVal.S = EVENT_TASTING;
scanExpression.limit = [NSNumber numberWithInt:maxCount];
scanExpression.filterExpression = @"#l = :location AND event = :event";
scanExpression.expressionAttributeNames = @{@"#l":@"location"};
scanExpression.expressionAttributeValues = @{@":location":locationVal,
@":event":eventVal};
をしかし、今、私はエラーを取得しています:
The request failed. Error: [Error Domain=com.amazonaws.AWSDynamoDBErrorDomain Code=0 "(null)" UserInfo={message=ExpressionAttributeValues contains invalid value: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes for key :location, __type=com.amazon.coral.validate#ValidationException}]
私が言及したように:「このスキャンは、提供されたエントリに対して結果を受け取るべきであることを検証したにもかかわらず、ゼロ結果を返す」はい、Androidはサポートしていますが、古いフィルタ条件を使用していますが、iOSはサポートしていません。 – LNI
'location'と' event'をインスタンス化する方法を提供する必要があります。また、[冗長なログを有効にする](http://docs.aws.amazon.com/mobile/sdkforios/developerguide/setup.html)を参照して、リクエストJSONで質問を更新してください。 –
verbose loggingオプションの出力で質問を更新しました。イベントと場所の両方が文字列です。上記の出力は、それらが正しく設定されていることを示しています。 DynamoDBコンソールを使用してクエリ内のイベントと場所に同じ値を使用すると、スキャンによって値が正常に返されます。 – LNI