ManveenT
ManveenT

Reputation: 23

DynamoDB AmazonServiceException: The provided key element does not match the schema

So can someOne guide me why I'm getting this exception. Here are the list of exceptions bcz of which the app has stopped:- 11-11 17:54:22.724 5048-5171/com.creation.ceaggregation1 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3 Process: com.creation.ceaggregation1, PID: 5048 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:304) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: com.amazonaws.AmazonServiceException: The provided key element does not match the schema (Service: AmazonDynamoDB; Status Code: 400; Error Code: ValidationException; Request ID: C8BTD5J7Q2477PSOK1F9G3FUTFVV4KQNSO5AEMVJF66Q9ASUAAJG) at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:712) at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:388) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:4181) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:1582) at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:1173) at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:873) at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:1056) at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:904) at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:688) at com.creation.ceaggregation1.EnterUser$UpdateTable.doInBackground(EnterUser.java:64) at com.creation.ceaggregation1.EnterUser$UpdateTable.doInBackground(EnterUser.java:40) at android.os.AsyncTask$2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  at java.lang.Thread.run(Thread.java:818)  11-11 17:54:24.769 5048-5171/com.creation.ceaggregation1 I/Process: Sending signal. PID: 5048 SIG: 9

Heres my mapper class:-

@DynamoDBTable(tableName = "agation1")
public class AWSDynamDBMapperClass {
String username;
String password;

@DynamoDBHashKey(attributeName="username")//username
public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

@DynamoDBAttribute(attributeName = "password")//password
public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}
}

Here is mainActivity code:- private class UpdateTable extends AsyncTask {

    @Override
    protected String doInBackground(String... params) {
        String name = params[0];
        String password = params[1];

        try {
            AWSDynamoDBManagerClass manager = new     AWSDynamoDBManagerClass();
            CognitoCredentialsProvider credentialsProvider = manager.getCredentials(EnterUser.this);
            AWSDynamDBMapperClass mapperClass = new AWSDynamDBMapperClass();
            mapperClass.setUsername(name);
            mapperClass.setPassword(password);

           if (credentialsProvider != null && mapperClass != null) {
                DynamoDBMapper dynamoDBMapper = manager.initDynamoClient((CognitoCachingCredentialsProvider) credentialsProvider);
                dynamoDBMapper.save(mapperClass);//gives error over here

            } else {
                return "ss";
            }
            return "rr";

        } catch (DynamoDBMappingException ex) {
            ex.printStackTrace();
            return "exception";
        }
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if(result.equals("ss")){
            Toast.makeText(EnterUser.this, "Entered successfully :) ", Toast.LENGTH_LONG).show();
        }else if(result.equals("rr")){
            Toast.makeText(EnterUser.this, "Already Existing", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(EnterUser.this, "**Exception Caught**", Toast.LENGTH_SHORT).show();
        }
    }
}

2 What is the difference between partition key, primary key hash key and sort key??

3 Please suggest if AsyncTask is required here or not. Also please suggest its benefits and disadvantages (through example,if possible it will be better)

Thank You for helping.

Upvotes: 1

Views: 2527

Answers (1)

WestonE
WestonE

Reputation: 802

1) This is probably because the table "agation1" does not have the partition key set to "username" or it is not a string

2) The partition key is the combination of primary key hash + sort key. The two together uniquely identify a row. However your table does not have to have a sort key. If it has no sort key, the partition key is the same as the hash key.

3) You must make the save calls on a different thread, AsyncTask is one way to do that.

Upvotes: 1

Related Questions