不能在Unity中查询或扫描DynamoDB



tldr:无法从queryAsync或scanasync创建一个asyncsearch对象,而不会遇到AWS库中深处的怪异参数nullexception。

我正在开发Unity的在线游戏,并希望将数据与DynamoDB同步。当我只有一个带有播放器数据的表格时,这效果很好。我只会使用" dbcontext.loadasync(id,callback);"而且它可以完美地发挥作用。用" saveAsync"保存也有效。

现在我介绍了更多表,需要进行扫描和查询。出于测试目的,我给了我的Unity应用程序所有可能具有的所有权利(我使用了" dynamodb:*"one_answers"资源":["*"]。

)。

我基本上尝试了具有不同参数的ScanAsync,QueryAsync和FromqueryAsync的所有可能版本,但我总是会出现错误。

简单示例:我想下载(我的大学的所有部门):

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

这个呼叫已经失败了,然后才能执行诸如" search.getRemainingasync(parkback)"之类的事情。简单查询也是如此:

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)

如果我想根据辅助索引查询,情况会变得更糟。为此,我需要在哈希和范围键之后附加一个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)

我的Unity版本是5.6.3f1。我尝试了AWSSDK.DYNAMODBV2.3.3.4.18和较旧的AWSSDK.DYNAMODBV2.3.3.3.4.14 UNITY软件包,其中包含直接从Amazon下载的AWS SDK。

如果有人提示我做错了什么,我真的很感激,谢谢!

您需要在创建查询之前构建请求对象。我从来没有使用过统一性,但应该像

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

具体来说,看来您没有将密钥调查作为请求的一部分,这是必需的。

最新更新