2017-08-15 51 views
1

我有问题了解如何从我的Android应用程序为dynamoDB创建列表。 我可以从我的应用程序中存储和加载{ "deviceId": "920e185a-63ed-46ca-bfca-f7a484ccb708" }。但是,然后添加List并将我的JSON对象存储为List中的Map是我挣扎。DynamoDB列表类型

的dynamoDB结构我要创建和填充看起来像这样的JSON格式:

{ "data": [ { "heartBeatId": 1, "status": 1, "timeStamp": 1502183502711 }, { "heartBeatId": 2, "status": 1, "timeStamp": 1502183502812 } ], "deviceId": "90563daa-63ae-40c5-905e-9e8c02f9624f" } 然后我想填充心跳对象,它是地图类型的数据列表。 { "heartBeatId": 2, "status": 1, "timeStamp": 1502183502812 } 所以即时通过定义@DynamoDBTable(tableName = "heartbeat")类来创建此结构时遇到问题。

我一直在阅读有关列表和DynamoDBDocument这里:

DynamoDBDocument

DataType List

这是怎么@DynamoDBTable(tableName = "heartbeat")类看起来现在。

我希望有人能帮助我定义它,或给我提供线索,了解如何获得我需要的结构。

package com.example.android.awsdynamoapp; 

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute; 
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBDocument; 
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey; 
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable; 

import java.lang.annotation.Annotation; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

@DynamoDBTable(tableName = "heartbeat") 
public class HeartBeat implements DynamoDBTable { 

private String deviceId; 
private Map<String, Integer> data; 
private List dataList; 

public HeartBeat(){}; 
public HeartBeat(String deviceId){this.deviceId = deviceId;}; 

public HeartBeat(String deviceId, List dataList) { 
    this.deviceId = deviceId; 
    this.dataList = dataList; 
    // this.timeStamp = timeStamp; 
} 

@DynamoDBHashKey(attributeName = "deviceId") 
public String getDeviceId() { 
    return deviceId; 
} 

public void setDeviceId(String deviceId) { 
    this.deviceId = deviceId; 
} 
public void setTimeStamp(String timeStamp) { 
    //this.timeStamp = timeStamp; 
} 


public void setData(String deviceId) { 
    Map<String, Integer> data = new HashMap<>(); 

} 

@DynamoDBAttribute(attributeName = "data") 
public List getData() { 
    return this.dataList; 
} 

@DynamoDBDocument 
public static class JsonArray { 
    private String heartBeatId; 
    private String status; 
    private String timeStamp; 

} 

/** 
* The name of the table to use for this class. 
*/ 
@Override 
public String tableName() { 
    return "heartbeat"; 
} 

@Override 
public Class<? extends Annotation> annotationType() { 
    return null; 
} 
} 

回答

2

地图对象的列表可以创建如下。上述结构中的好处在于,data中的所有属性都是数字。如果需要,您也可以将其更改为字符串。根据您的预期产出,我已将其定义为Long

属性定义: -

private List<Map<String, Long>> data; 

@DynamoDBAttribute(attributeName = "data") 
public List<Map<String, Long>> getData() { 
    return data; 
} 

public void setData(List<Map<String, Long>> data) { 
    this.data = data; 
} 

填充数据: -

MoviesWithData movies = new MoviesWithData(); 
    movies.setYearKey(1917); 
    movies.setTitle("Tilte with list of map"); 

    Map<String, Long> dataMap1 = new HashMap<>(); 
    dataMap1.put("heartBeatId", 1L); 
    dataMap1.put("status", 1L); 
    dataMap1.put("timeStamp", 1502183502812L); 

    Map<String, Long> dataMap2 = new HashMap<>(); 
    dataMap2.put("heartBeatId", 2L); 
    dataMap2.put("status", 2L); 
    dataMap2.put("timeStamp", 1503183502812L); 

    movies.setData(Arrays.asList(dataMap1, dataMap2)); 
    dynamoDBMapper.save(movies, consistentDynamoDBMapperConfig); 

示例输出: -

enter image description here

+0

这适用于创建我需要的结构。非常感谢。但我还没有明白如何添加一个新的对象到列表中。这样我每次都覆盖它.save() – Daniel

+0

好。 OP正在要求样本创建结构。我希望答案能够解决这个问题。如果您想要更新数据,则可以使用低级API而不是映射器来防止更新所有出现的列表属性。 – notionquest

+0

再次感谢您的帮助。我已经接受了这个答案。 – Daniel