Ich verwende DynamoDB als Back-End-Datenbank für meine mobile App, und das Schema usw. sind über Android & iOS identisch. Für einen bestimmten Anwendungsfall muss ich einen Scan durchführen, basierend auf zwei Attributen, die nicht indiziert sind. Für iOS Objective C, verwende ich den folgenden Code:AWS DynamoDB Scan schlägt auf iOS fehl, funktioniert aber unter 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};
Sowohl der Trassierung und sind Strings. EVENT_TASTING ist eine String-Konstante. Dieser Scan führt immer zu Null-Ergebnissen, obwohl ich bestätigt habe, dass die Ergebnisse für die bereitgestellten Einträge erhalten werden sollten. Ich verwende den folgenden Code in 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)));
Der Scan funktioniert wie erwartet in Android. Was muss sich in iOS ändern, damit es auch dort funktioniert? Ich habe iOS SDK auf 2.3.6 aktualisiert, aber es hat keinen Unterschied gemacht. Dies ist die einzige Scanoperation, die ich in meinem Code durchführe.
Gibt es einen Fehler in meinem ScanExpression für iOS? Gibt es eine Möglichkeit, die Android-Stil-Syntax zu verwenden, um dies auf iOS zu arbeiten?
aktualisieren
ich folgende Änderungen versucht:
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};
Aber jetzt habe ich eine Störung erhalte:
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}]
Wie schon erwähnt: "Dieser Scan liefert immer null Ergebnisse, obwohl ich bestätigt habe, dass ich für die bereitgestellten Einträge die Ergebnisse erhalten sollte." Und ja, ich benutze die ältere Filterbedingung, weil Android es unterstützt, aber iOS nicht. – LNI
Sie müssen noch angeben, wie Sie "location" und "event" instanziieren. Aktivieren Sie [die ausführliche Protokollierung] (http://docs.aws.amazon.com/mobile/sdkforios/developerguide/setup.html) und aktualisieren Sie die Frage mit der Anfrage JSON. –
Die Frage wurde mit der Ausgabe der ausführlichen Protokollierungsoption aktualisiert. Sowohl Ereignis als auch Ort sind Strings. Die obige Ausgabe zeigt, dass sie korrekt eingestellt sind. Wenn ich in einer Abfrage mithilfe der DynamoDB-Konsole dieselben Werte für Ereignis und Speicherort verwende, gibt der Scan die Werte erfolgreich zurück. – LNI