2017-12-06 4 views
2
でDynamoDBのをスキャンすることはできません

TLDR:が深いAWSライブラリ内の奇妙な例外ArgumentNullExceptionに実行せずにQueryAsyncまたはScanAsyncからAsyncSearchオブジェクトを作成できません。照会またはユニティ

私はUnityでオンラインゲームを開発しており、DynamoDBとデータを同期したいと考えています。私はプレーヤーのデータを持つテーブルしか持っていなかったので、これはとてもうまくいった。私は "DBContext.LoadAsync(id、callback);"それは完璧に動作します。 "SaveAsync"で保存するだけでも動作します。

ここで、さらにテーブルを導入しました。スキャンとクエリを実行する必要があります。テスト目的のために、私はUnityアプリケーションに可能性のあるすべての権利を与えました(私はIAMで "dynamodb:*"と "Resource":["*"]を使用しました)。

基本的には、ScanAsync、QueryAsync、FromQueryAsyncのすべてのバージョンをさまざまなパラメータで試しましたが、私はいつもエラーが発生します。

簡単な例:

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

この呼び出しはすでに失敗し、私は「search.GetRemainingAsync(コールバック)」のような何かを行うことができます前に、私は(私の大学の)すべての部門をダウンロードしたいです。

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

エラーは以下の通りですし、どこか深いAWSライブラリであるので、私は本当に、そこに行くいくつかのブレークポイントを設定して失敗している正確に何を見ることができない:同じことのような単純なクエリのために行きます

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) 

2次インデックスに基づいてクエリを実行すると、さらに悪化します。そのために、私はそうのようなハッシュとレンジのキーのための条件の後DynamoDBOperationConfigを添付する必要があります。

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

を今、何らかの形で、queryConfigは(レンジキーのためのちょうど別の値であると考えているようだので、それは基本的に選択されますQueryAsyncの間違ったオーバーロードされたバージョン)。または、少なくとも今私は奇妙な変換エラーが発生するので、何が起こるかと思います。

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) 

My Unityバージョンは5.6.3f1です。私はAWSSDK.DynamoDBv2.3.3.4.18と、Amazonから直接ダウンロードしたAWS SDKを含む古いAWSSDK.DynamoDBv2.3.3.4.14 Unityパッケージを試しました。

誰かが私が間違っている可能性があるヒントがあるなら、本当に感謝します。

答えて

0

クエリを作成する前に、リクエストオブジェクトを作成する必要があります。私はUnityの使ったことがないが、それはあなたが必要とする要求の一部としてあなたのkeyconditionを含めていないように見える、具体的に

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)); 

のようなものでなければなりません。

+0

ありがとうございます。残念ながら、このようなリクエストを作成するUnityではサポートされていません。 QueryRequestを引数として持つQueryAsync関数はありません。代わりに、TがDynamoDBテーブル属性を持つクラスであるQueryAsync が存在します。このクラスはテーブル項目の表現であり、テーブル名、ハッシュ、および範囲キーは属性を使用して定義されます。 ハッシュキーの値を渡すだけで関数を使用できるはずです。これはロードと保存で機能しますが、クエリとスキャンは機能しません。 スキャンの場合、キーは必要ありません。私はそれがスキャンの全体のポイントだと思った... – Ben

+0

申し訳ありませんがそれ以上の役に立たなかった。どのDynamoDB Unityドキュメントにもアクセスできますか?私は何も見つけることができませんでした。何か助けがあれば(ここの例)(https://github.com/awslabs/aws-sdk-unity-samples/blob/master/DynamoDB/TableQueryAndScanExample.cs)を取ったのですか? – Stu

+0

AWSフォーラムの一例です。[これは参考になるかもしれません](https://forums.aws.amazon.com/thread.jspa?threadID=238763) – Stu