我在使用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>>
提前致谢。
答案 0 :(得分:1)
如果您希望将channel
属性保留为List<Map<String, Object>>
,则简单的答案是您无法将值保存为Map对象列表。唯一可用的解决方案是将数据转换为String并存储在DynamoDB中。
要转换为String或JSON的几个选项: -
1)@DynamoDBTypeConvertedJson
- 此注释可用于将数据转换为JSON并将其作为String属性存储在DynamoDB中
@DynamoDBMarshalling
- 已弃用
2)编写自定义转换器。同样,这会将数据保存为DynamoDB中的String。
注意: - 强>
虽然DynamoDB支持列表和地图等文档数据类型,但如果列表中有Map,则无法查询数据。 DynamoDB API不支持过滤此数据模型的数据。
如果您需要支持查询/更新channels
属性的任何用例,我强烈建议您重新考虑数据模型以平整数据结构。
另一个缺点是无法在文档数据类型(列表和地图)上创建索引。
答案 1 :(得分:0)
我不确定你在这里寻找什么。每当任何对象进入网络或保存到数据库中时;它被保存为String ..现在如何实现这一点是为了使该对象可序列化。确保您的对象(在List中)实现Serializable。
你不应该担心它是否在DB中保存为String(因为这无论如何都是因为那是另一个系统,而不是可以容纳java对象的JVM);当你要求这个对象时,重要的是什么; dynamoDB会自动将此对象转换为您需要的List。