2017-12-06 1 views
2

TLDR: kann kein AsyncSearch Objekt aus QueryAsync oder ScanAsync erstellen, ohne tief in der AWS-Bibliothek in ein seltsames Argument läuft.Können abfragen oder scannen DynamoDB nicht in Unity

Ich entwickle ein Online-Spiel in Unity und möchte Daten mit DynamoDB synchronisieren. Als ich nur einen Tisch mit Spielerdaten hatte, funktionierte das sehr gut. Ich würde einfach "DBContext.LoadAsync (ID, Callback);" und es funktioniert einwandfrei. Das Speichern mit "SaveAsync" funktioniert genauso gut.

Nun stellte ich einige weitere Tabellen und ich brauche Scans und Abfragen durchzuführen. Zu Testzwecken gab ich meiner Unity-App alle Rechte, die sie möglicherweise haben konnte (ich verwendete "dynamodb: *" und "Resource": ["*"] in IAM).

Ich habe versucht, im Grunde alle möglichen Versionen von ScanAsync, QueryAsync und FromQueryAsync mit verschiedenen Parametern, aber ich bekomme nur immer einen Fehler.

Einfaches Beispiel: Ich möchte alle Abteilungen zum Download (meiner Universität):

AsyncSearch<DepartmentData> search = AWSManager.Instance.DBContext.ScanAsync<DepartmentData>(); 

Dieser Aufruf bereits versagt, bevor ich etwas wie „search.GetRemainingAsync (Rückruf)“ tun kann. Das gleiche gilt für für einfache Anfragen wie:

AsyncSearch<POIVisit> query = AWSManager.Instance.DBContext.QueryAsync<POIVisit>(poiType); 

Der Fehler wird die folgende und irgendwo tief in der AWS-Bibliothek ist, so kann ich wirklich da drin nicht gehen, setzen einige Haltepunkte und sehen, was genau ausfällt:

ArgumentNullException: Argument cannot be null. 
Parameter name: key 
System.Collections.Generic.Dictionary`2[System.Type,Amazon.Runtime.IExceptionHandler].TryGetValue (System.Type key, IExceptionHandler& value) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:588) 
Amazon.Runtime.Internal.ErrorHandler.ProcessException (IExecutionContext executionContext, System.Exception exception) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/ErrorHandler/ErrorHandler.cs:202) 
Amazon.Runtime.Internal.ErrorHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/ErrorHandler/ErrorHandler.cs:78) 
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/PipelineHandler.cs:57) 
Amazon.Runtime.Internal.CallbackHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/Handlers/CallbackHandler.cs:45) 
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/PipelineHandler.cs:57) 
Amazon.Runtime.Internal.Signer.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/Handlers/Signer.cs:38) 
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/PipelineHandler.cs:57) 
Amazon.Runtime.Internal.CredentialsRetriever.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/Handlers/CredentialsRetriever.cs:72) 
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/PipelineHandler.cs:57) 
Amazon.Runtime.Internal.RetryHandler.InvokeSync (IExecutionContext executionContext) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Core/Amazon.Runtime/Pipeline/RetryHandler/RetryHandler.cs:74) 

Es wird noch schlimmer, wenn ich basierend auf einem sekundären Index abfragen möchte. Dafür brauche ich eine DynamoDBOperationConfig nach den Bedingungen für die Hash-und Bereichsschlüssel wie so anbringt:

var queryConfig = new DynamoDBOperationConfig() { IndexName = "PlayerIndex" }; 
AsyncSearch<POIVisit> query = AWSManager.Instance.DBContext.QueryAsync<POIVisit>(poiType, QueryOperator.Equal, PlayerID, queryConfig); 

Nun scheint es irgendwie zu denken, die QueryConfig ist nur ein weiterer Wert für den Bereich Schlüssel (so wählt es im Grunde die falsch überladene Version von QueryAsync). Oder zumindest glaube ich, dass das, was passiert, weil ich einen seltsamen Konvertierungsfehler bekommen:

InvalidCastException: Cannot cast from source type to destination type. 
Amazon.DynamoDBv2.Converter`1[T].TryTo (System.Object value, Amazon.DynamoDBv2.DocumentModel.Primitive& p) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Services/DynamoDBv2/Custom/Conversion/DynamoDBEntryConversion.cs:630) 
… 
Amazon.DynamoDBv2.DataModel.DynamoDBContext.QueryAsync[POIVisit] (System.Object hashKeyValue, QueryOperator op, System.Object[] values) (at E:/JenkinsWorkspaces/v3-trebuchet-release/AWSDotNetPublic/sdk/src/Services/DynamoDBv2/Custom/DataModel/_unity/Context.Async.cs:550) 
DBManager.RetrievePlayerVisits (System.String poiType, UnityEngine.Events.UnityAction`1 callback) (at Assets/Scripts/Managers/DBManager.cs:359) 

Meine Unity Version 5.6.3f1 ist. Ich habe versucht, AWSSDK.DynamoDBv2.3.3.4.18 und die älteren Pakete AWSSDK.DynamoDBv2.3.3.4.14 Unity, die das AWS SDK direkt von Amazon heruntergeladen enthalten.

Wenn jemand einen Tipp hat, was ich falsch tun könnte, würde ich wirklich dankbar, danke!

Antwort

0

Sie benötigen ein Request-Objekt zu erstellen, bevor Sie eine Abfrage erstellen. Ich habe noch nie die Einheit verwendet, aber es sollte so etwas wie

var request = new QueryRequest(); 
request.TableName = "YourTable"; 
request.KeyConditions = new Dictionary<string, Condition>() 
{ 
    { 
     "YourId", new Condition() 
     { 
      ComparisonOperator = "EQ", 
      AttributeValueList = new List<AttributeValue>() 
      { 
       new AttributeValue { S = YourId } 
      } 
     } 
    } 
}; 

client.QueryAsync(request,(result)); 

Insbesondere sein, es sieht aus wie Sie nicht Ihre keycondition als Teil des Antrags sind inklusive, die erforderlich ist.

+0

Vielen Dank. In Unity wird das Erstellen solcher Anfragen leider nicht unterstützt. Es gibt keine QueryAsync-Funktion mit einem QueryRequest als Argument. Stattdessen gibt es QueryAsync , wobei T eine Klasse mit einem DynamoDB-Tabellenattribut ist. Diese Klasse ist die Darstellung eines Tabellenelements und der Tabellenname, der Hash- und der Bereichsschlüssel werden mithilfe von Attributen definiert. Ich sollte in der Lage sein, die Funktion nur durch die Übergabe eines Wertes für den Hash-Schlüssel verwenden.Dies funktioniert beim Laden und Speichern, jedoch funktionieren Query und Scan nicht. Zum Scannen sollte sowieso kein Schlüssel notwendig sein. Ich dachte, das ist der Sinn des Scans ... – Ben

+0

Sorry, es war nicht hilfreicher. Haben Sie Zugriff auf DynamoDB Unity-Dokumente? Ich konnte keine finden. Ich habe das [Beispiel von hier] (https://github.com/awslabs/aws-sdk-unity-samples/blob/master/DynamoDB/TableQueryAndScanExample.cs) genommen, wenn das irgendeine Hilfe ist? – Stu

+0

Und vielleicht [dieser könnte hilfreich sein] (https://forums.aws.amazon.com/thread.jspa?threadID=238763) - ein Beispiel für die AWS-Foren. – Stu

Verwandte Themen