在DynamoDB Map中插入java.lang.Object

时间:2016-12-23 13:32:02

标签: android amazon-web-services amazon-dynamodb

我在使用DynamoDB同步数据的Android应用中工作

我需要插入属性List<Map<String, Object>>

这是我的DynamoDB表结构

public class AmznDynamoDeviceDB {
    private String identityID;    
    private String deviceName;
    private List<Map<String, Object>> channels;

    @DynamoDBHashKey(attributeName = "identityID")
    public String getIdentityId(){
        return this.identityID;
    }
    public void setIdentityId(String identityID){
        this.identityID = identityID;
    }

    @DynamoDBAttribute(attributeName = "deviceName")
    public String getDeviceName(){
        return this.deviceName;
    }
    public void setDeviceName(String deviceName){
        this.deviceName = deviceName;
    }

    @DynamoDBAttribute(attributeName = "channels")
    public List<Map<String, Object>> getChannels(){
        return this.channels;
    }
    public void setChannels(List<Map<String, Object>> channels){
        this.channels = channels;
    }    
}

我在DynamoDB中插入时收到以下错误

W/System.err: com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: Cannot marshall type class java.lang.Object without a custom marshaler or @DynamoDBDocument annotation.

我可以在DynamoDB中的Map元素中插入java.lang.Object。

注意:如果我使用@DynamoDBMarshalling存储数据作为字符串我需要插入List<Map<String, Object>>

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您希望将channel属性保留为List<Map<String, Object>>,则简单的答案是您无法将值保存为Map对象列表。唯一可用的解决方案是将数据转换为String并存储在DynamoDB中。

要转换为String或JSON的几个选项: -

1)@DynamoDBTypeConvertedJson - 此注释可用于将数据转换为JSON并将其作为String属性存储在DynamoDB中

@DynamoDBMarshalling - 已弃用

2)编写自定义转换器。同样,这会将数据保存为DynamoDB中的String。

DynamoDBTypeConverted

注意: -

虽然DynamoDB支持列表和地图等文档数据类型,但如果列表中有Map,则无法查询数据。 DynamoDB API不支持过滤此数据模型的数据。

如果您需要支持查询/更新channels属性的任何用例,我强烈建议您重新考虑数据模型以平整数据结构。

另一个缺点是无法在文档数据类型(列表和地图)上创建索引。

答案 1 :(得分:0)

我不确定你在这里寻找什么。每当任何对象进入网络或保存到数据库中时;它被保存为String ..现在如何实现这一点是为了使该对象可序列化。确保您的对象(在List中)实现Serializable。

你不应该担心它是否在DB中保存为String(因为这无论如何都是因为那是另一个系统,而不是可以容纳java对象的JVM);当你要求这个对象时,重要的是什么; dynamoDB会自动将此对象转换为您需要的List。