我正在使用 AWS DynamoDB服务。 我创建了一个表“Parkurself”作为哈希键,没有范围键,“Latitude”,“Longitude”作为两个属性。而且我在桌子上有一个项目,(“parkurself”,30,30)为(Parkurself,Longitude,Latitude)。 当我使用 Android SDK 查询数据库时,我使用了以下程序。
DynamoDBQueryExpression queryExpression=new DynamoDBQueryExpression()
.withHashKeyValues("parkurself")
.withFilterExpression("Latitude>25")
.withFilterExpression("Latitude<40")
.withFilterExpression("Longitude>25")
.withFilterExpression("Longitude<40")
.withConsistentRead(false);
PaginatedQueryList<ParkingInfo> result=mapper.query(ParkingInfo.class, queryExpression);
但是,我收到错误“在查询中找不到哈希键条件” Logcat正在附加。
Caused by: java.lang.IllegalArgumentException: Illegal query expression: No hash key condition is found in the query
at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.processKeyConditions(DynamoDBMapper.java:2420)
at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.createQueryRequestFromExpression(DynamoDBMapper.java:2382)
at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.query(DynamoDBMapper.java:2166)
at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.query(DynamoDBMapper.java:2127)
at monster.com.parkurself.QueryParkingInfo.doInBackground(QueryParkingInfo.java:63)
at monster.com.parkurself.QueryParkingInfo.doInBackground(QueryParkingInfo.java:18)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
我不知道如何修复它。 谁能给我一些帮助? 提前谢谢。
答案 0 :(得分:1)
你没有通过dynamo db mapper(http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html和http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html) 为了使用DynamoDBQueryExpression,您必须通过映射器。 你传入withHashKeyValues的内容需要是一个从具有正确注释的类实例化的对象。见这里的例子:
您需要创建一个以Parkurself,Longitude,Latitude为成员的类,并通过属性正确标记它们。
有关如何访问DDB的更多信息,请访问: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/AboutJava.html
如果您不想/需要使用映射器(即高级API),您可以通过低级api。
答案 1 :(得分:1)
正如Mircea所说,你需要创建一个类,它首先封装了你已经完成的条目。这里的问题是你已经传递了没有映射属性的String类。
创建mapper类的实例,并将哈希键设置为您要查询的哈希键。将该类传递给查询,它应该可以工作。
// Create object which maps to the query object.
ParkingInfo parkingInfo = new ParkingInfo();
parkingInfo.setID("parkurself");
DynamoDBQueryExpression<ParkingInfo> queryExpression = new DynamoDBQueryExpression<ParkingInfo>()
.withHashKeyValues(parkingInfo)
.withFilterExpression("Latitude>25")
.withFilterExpression("Latitude<40")
.withFilterExpression("Longitude>25")
.withFilterExpression("Longitude<40")
.withConsistentRead(false);
PaginatedQueryList<ParkingInfo> result = mapper.query(ParkingInfo.class, queryExpression);