пакетное обновление aws mobilehub no-sql с набором дополнений - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь обновить атрибуты полей двух разных таблиц в DynamodB через приложение Android.После долгих поисков я обнаружил следующее: -

dynamoDBMapper.batchSave(modelObj1, modelObj2);

Эта функция работает правильно, но в конфигурации «ОБНОВЛЕНИЕ», т.е. удаляет все остальные атрибуты в поле, оставляя только обновленные атрибуты.Но я хочу, чтобы он был в конфигурации "APPEND_SET", т.е. все атрибуты, которые не должны обновляться, также остаются в поле.

Я успешно обновляю поле с помощью конфигурации "SET_APPEND" при работе с обновлением одной таблицы (то есть не пакетно), как это: -

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

Но это не работает в случае batchSave.

Вот мой код: -

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();
  }
}

Это приводит к ошибке: -

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