aws mobilehub no-sql batch update with append set

85 Views Asked by At

I am trying to update attributes of fields of two different tables in dynamodb via android application. After searching a lot I found this:-

dynamoDBMapper.batchSave(modelObj1, modelObj2);

This function is working correctly but in "UPDATE" configuration i.e. removing all other attributes in the field leaving only updated attributes. But I want it to be in "APPEND_SET" configuration i.e. all attributes which are not supposed to update also stays in the field.

I am successfully updating field with "SET_APPEND" configuration when dealing with single table update (i.e. not batch) like this:-

DynamoDBMapperConfig dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder()
                    .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)
                    .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.APPEND_SET)
                    .build();
dynamoDBMapper.save(newsItem, dynamoDBMapperConfig);

But this doesn't work in case of batchSave.

Here's my code:-

public class MainActivity extends AppCompatActivity {

static DynamoDBMapper dynamoDBMapper;
String userId;

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

    // AWSMobileClient enables AWS user credentials to access your table
    AWSMobileClient.getInstance().initialize(this).execute();

    AWSCredentialsProvider credentialsProvider = AWSMobileClient.getInstance().getCredentialsProvider();
    AWSConfiguration configuration = AWSMobileClient.getInstance().getConfiguration();

    // Add code to instantiate a AmazonDynamoDBClient
    AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(credentialsProvider);

    dynamoDBMapper = DynamoDBMapper.builder()
            .dynamoDBClient(dynamoDBClient)
            .awsConfiguration(configuration)
            .build();

    batchSave();
}

public void batchSave() {
    final UserInfoDO userInfoDO = new UserInfoDO();

    userInfoDO.setUserId(userId);
    userInfoDO.setRoomNumber(123D);

    final ComplaintTableDO complaintTableDO = new ComplaintTableDO();
    complaintTableDO.setComplaintId("1234567890");
    complaintTableDO.setUserId(userId);

    new Thread(new Runnable() {
        @Override
        public void run() {
            DynamoDBMapperConfig dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder()
                    .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)
                    .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.APPEND_SET)
                    .build();
            dynamoDBMapper.batchSave(userInfoDO,complaintTableDO, dynamoDBMapperConfig);
        }
    }).start();
  }
}

This produces error:-

com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: Class class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapperConfig must be annotated with interface com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable
    at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.getTable(DynamoDBReflector.java:172)
    at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapperConfig$DefaultTableNameResolver.getTableName(DynamoDBMapperConfig.java:508)
    at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.internalGetTableName(DynamoDBMapper.java:809)
    at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.getTableName(DynamoDBMapper.java:790)
    at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.batchWrite(DynamoDBMapper.java:1733)
    at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.batchSave(DynamoDBMapper.java:1664)
1

There are 1 best solutions below

0
On

Looks like that's the intended behavior based on this thread. You just gotta do multiple roundtrips for this (do it in parallel as save is blocking).