首页 > 解决方案 > 带有附加集的 aws mobilehub no-sql 批量更新

问题描述

我正在尝试通过 android 应用程序更新 dynamodb 中两个不同表的字段的属性。经过大量搜索后,我发现了这个:-

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)

标签: androidamazon-web-servicesamazon-dynamodbaws-mobilehubamazon-mobile-hub

解决方案


看起来这是基于此线程的预期行为。你只需要为此进行多次往返(并行执行,因为保存阻塞)。


推荐阅读