【问题标题】:To query my AWS dynamoDB to find the count of entries with a particular hash value through Android App通过 Android App 查询我的 AWS dynamoDB 以查找具有特定哈希值的条目数
【发布时间】:2017-09-27 05:14:23
【问题描述】:

我的表有两列,即国家城市,有 3 个条目,其哈希键相同,分别是印度孟买、印度德里、印度班加罗尔(在 aws dynamodb 中手动检查),其余各不相同,例如日本东京。我希望通过我的 android 应用程序获得计数 3。 这是我的代码:-

public class MainActivity extends AppCompatActivity {
Button buttonRetrieve;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buttonRetrieve = (Button) findViewById(R.id.btn_retrievedata);

    buttonRetrieve.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new RetrieveData().execute();
        }
    });
}
 private class RetrieveData extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        //Toast.makeText(MainActivity.this, "in do in background", Toast.LENGTH_SHORT).show();

        try {
            Manager manager = new Manager();
            CognitoCredentialsProvider credentialsProvider = manager.getCredentials(MainActivity.this);
            Mapper mapperClass = new Mapper();

            if (credentialsProvider != null && mapperClass != null) {
                DynamoDBMapper dynamoDBMapper = manager.initDynamoClient((CognitoCachingCredentialsProvider) credentialsProvider);
                DynamoDBQueryExpression dynamoDBQueryExpression = new DynamoDBQueryExpression().withLimit(5).withHashKeyValues("India")
                        .withRangeKeyCondition("City", new Condition()
                                .withComparisonOperator(ComparisonOperator.EQ)
                                .withAttributeValueList(new AttributeValue()
                                        .withS("Mumbai")));
                 int s = dynamoDBMapper.count(Mapper.class, dynamoDBQueryExpression);
                 Toast.makeText(MainActivity.this, "the entries are " + s, Toast.LENGTH_SHORT).show();
           } else {
                return "h";
            }
            return "m";
        } catch (DynamoDBMappingException ex)

        {
            ex.printStackTrace();
            return "k";
        }
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (result.equals("h")) {
            Toast.makeText(MainActivity.this, "Already Existing", Toast.LENGTH_LONG).show();
        } else if (result.equals("m")) {
            Toast.makeText(MainActivity.this, "Retrieved data successfully :)", Toast.LENGTH_SHORT).show();
            } else {
            Toast.makeText(MainActivity.this, "**Exception Caught**", Toast.LENGTH_SHORT).show();
        }
    }
}
}

我尝试使用上面的代码检索 1 个值,其中国家为“印度”,城市为“孟买”,但它显示以下错误:-

com.example.dynamo1 I/DpmTcmClient: RegisterTcmMonitor from: com.android.okhttp.TcmIdleTimerMonitor
 04-29 07:36:41.192 971-1084/com.example.dynamo1 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #5
                                                                          Process: com.example.dynamo1, PID: 971
                                                                          java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                              at android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                                              at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                              at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                              at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                              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)
                                                                           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.count(DynamoDBMapper.java:2292)
                                                                              at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.count(DynamoDBMapper.java:2274)
                                                                              at com.example.dynamo1.MainActivity$RetrieveData.doInBackground(MainActivity.java:61)
                                                                              at com.example.dynamo1.MainActivity$RetrieveData.doInBackground(MainActivity.java:41)
                                                                              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) 
04-29 07:36:41.402 971-1025/com.example.dynamo1 D/OpenGLRenderer: endAllStagingAnimators on 0x5579967990 (RippleDrawable) with handle 0x5579a

提前致谢!

【问题讨论】:

    标签: java android amazon-web-services amazon-dynamodb


    【解决方案1】:

    您需要创建映射器类 Object 并设置要查询的 Hash Key 属性。

    Mapper mapperClass = new Mapper();
    mapperClass.setCountry("India);
    // And then pass it to .withHashKeyValues(mapperClass);
    

    【讨论】:

      【解决方案2】:

      您需要提供一个哈希键条件值。例如:

      Book bookToFind = new Book();
      bookToFind.setAuthor("Charles Dickens");
      
      String queryString = "Great";
      
      Condition rangeKeyCondition = new Condition()
              .withComparisonOperator(ComparisonOperator.BEGINS_WITH.toString())
              .withAttributeValueList(new AttributeValue().withS(queryString.toString()));
      
      DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression()
              .withHashKeyValues(bookToFind)
              .withRangeKeyCondition("Title", rangeKeyCondition)
              .withConsistentRead(false);
      
      PaginatedQueryList<Book> result = mapper.query(Book.class, queryExpression);
      // Do something with result.
      

      【讨论】:

      • 我通过创建条件对象DynamoDBQueryExpression dynamoDBQueryExpression = new DynamoDBQueryExpression().withLimit(5).withHashKeyValues("India") .withRangeKeyCondition("City", new Condition() .withComparisonOperator(ComparisonOperator.EQ) .withAttributeValueList(new AttributeValue() .withS("Mumbai")));@ShubhamJain 在 withRangeKeyCondition() 方法中提供了条件
      • @manveenkaur 为什么不尝试传递更高级别的对象而不是字符串对象?即:stackoverflow.com/questions/30840093/…
      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多