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)
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).