Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在Unity中查询或扫描DynamoDB_C#_Amazon Web Services_Unity3d_Amazon Dynamodb_Aws Sdk - Fatal编程技术网

C# 无法在Unity中查询或扫描DynamoDB

C# 无法在Unity中查询或扫描DynamoDB,c#,amazon-web-services,unity3d,amazon-dynamodb,aws-sdk,C#,Amazon Web Services,Unity3d,Amazon Dynamodb,Aws Sdk,TLDR:无法从QueryAsync或ScanAsync创建AsyncSearch对象,除非在AWS库的深处遇到异常 我正在Unity中开发一个在线游戏,希望与DynamoDB同步数据。当我只有一张包含玩家数据的表格时,这非常有效。我只需要使用“DBContext.LoadAsync(id,callback);”就可以了,而且它工作得非常完美。使用“SaveAsync”保存也可以 现在我介绍了更多的表,我需要执行扫描和查询。出于测试目的,我给了我的Unity应用程序可能拥有的所有权利(我在IAM

TLDR:无法从QueryAsync或ScanAsync创建AsyncSearch对象,除非在AWS库的深处遇到异常

我正在Unity中开发一个在线游戏,希望与DynamoDB同步数据。当我只有一张包含玩家数据的表格时,这非常有效。我只需要使用“DBContext.LoadAsync(id,callback);”就可以了,而且它工作得非常完美。使用“SaveAsync”保存也可以

现在我介绍了更多的表,我需要执行扫描和查询。出于测试目的,我给了我的Unity应用程序可能拥有的所有权利(我在IAM中使用了“dynamodb:*”和“Resource”:[“*”])

我用不同的参数尝试了ScanAsync、QueryAsync和FromQueryAsync的所有可能版本,但我总是遇到错误

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

如果我想基于二级索引进行查询,情况会更糟。为此,我需要在哈希和范围键的条件之后附加一个dynamodboOperationConfig,如下所示:

var queryConfig = new DynamoDBOperationConfig() { IndexName = "PlayerIndex" };
AsyncSearch<POIVisit> query = AWSManager.Instance.DBContext.QueryAsync<POIVisit>(poiType, QueryOperator.Equal, PlayerID, queryConfig);
我的Unity版本是5.6.3f1。我尝试了AWSSDK.DynamoDBv2.3.3.4.18和旧的AWSSDK.DynamoDBv2.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));
var request=newqueryrequest();
request.TableName=“YourTable”;
request.KeyConditions=新字典()
{
{ 
“YourId”,新条件()
{ 
ComparisonOperator=“EQ”,
AttributeValueList=新列表()
{
新属性值{S=YourId}
}
}
}
};
QueryAsync(请求,(结果));

具体来说,您似乎没有将您的密钥条件作为请求的一部分,这是必需的。

谢谢。不幸的是,在Unity中,不支持创建这样的请求。没有以QueryRequest作为参数的QuerySync函数。相反,存在QuerySync,其中T是一个具有DynamoDB表属性的类。此类是表项的表示形式,表名、哈希和范围键是使用属性定义的。我应该能够通过传递散列键的值来使用该函数。这适用于加载和保存,但查询和扫描不起作用。对于扫描,无论如何都不需要键。我以为这就是扫描的全部意义…对不起,这没有多大帮助。您有权访问任何DynamoDB Unity文档吗?我找不到。如果这有什么帮助的话,我就拿它做例子,也许是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)
var queryConfig = new DynamoDBOperationConfig() { IndexName = "PlayerIndex" };
AsyncSearch<POIVisit> query = AWSManager.Instance.DBContext.QueryAsync<POIVisit>(poiType, QueryOperator.Equal, PlayerID, queryConfig);
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)
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));