2015-07-06 51 views
0

我想向DynamoDB添加多个值。我想添加所有的数据集。向dynamoDB添加多个值

例如,如果有4个值,那么我想在DynamoDB中添加4行。对于'n'个接收值,应该添加'n'行。

我通过数组循环,但仍然只有最新的数据设置为项目,我只能保存一行。即每个阵列的最后一个值。

我该如何做到这一点。请帮帮我。

@RequestMapping(value="/receiveRequests", method=RequestMethod.POST,produces={"application/json"}) 
public Map<String, Object> receiveRequests(@RequestParam(value="user_id") String user_id, 
              @RequestParam(value="device_model") String device_model, 
              @RequestParam(value="api_key") String api_key, 
              @RequestParam(value="score") int[] score, 
              @RequestParam(value="registrationId") String registrationId, 
              @RequestParam(value="userLocalTime") String[] userLocalTime, 
              @RequestParam(value="lat") double[] lat, 
              @RequestParam(value="lon") double[] lon, 
              @RequestParam(value="accuracy") float[] accuracy, 
              @RequestParam(value="userTimezone") String userTimezone, 
              Model model) 
{ 
      try 
      { 
       AmazonDynamoDBClient client = DynamoDBConfig.getAmazonDBClient(); 
       DynamoDBMapper mapper = new DynamoDBMapper(client); 

       slf4jLogger.info("======================Begin Saving values to DynamoDB==================================================="); 
       ScoreTable item = new ScoreTable(); 
       for(int ScoreValue : score) 
       { 
        item.setScore(ScoreValue); 
        slf4jLogger.info("Saving Score: "+ScoreValue); 
       } 
       item.setDevice_model(device_model); 
       slf4jLogger.info("Saving device_model: "+device_model); 
       item.setApi_key(api_key); 
       slf4jLogger.info("Saving api_key: "+api_key); 
       item.setUser_id(user_id); 
       slf4jLogger.info("Saving user_id: "+user_id); 
       item.setRegistrationId(registrationId); 
       slf4jLogger.info("Saving registrationId: "+registrationId); 
       for(double latitude : lat) 
       { 
        item.setLat(latitude); 
        slf4jLogger.info("Saving latitude: "+latitude); 
       } 
       for(double longitude : lon) 
       { 
        item.setLon(longitude); 
        slf4jLogger.info("Saving longitude: "+longitude); 
       } 
       for(float accuracyValue : accuracy) 
       { 
        item.setAccuracy(accuracyValue); 
        slf4jLogger.info("Saving accuracyValue: "+accuracyValue); 
       } 
       for(String userlocaltym:userLocalTime) 
       { 
        item.setUserLocalTime(userlocaltym); 
        slf4jLogger.info("Saving userlocaltym: "+userlocaltym); 
       } 
       item.setUserTimezone(userTimezone); 
       slf4jLogger.info("Saving userTimezone"+userTimezone); 
       mapper.save(item); 
       slf4jLogger.info("StressScore Table items: "+item); 
      }   
      catch(AmazonServiceException ase) 
      { 
       //ase.printStackTrace(); 
       slf4jLogger.error(ase); 
       slf4jLogger.error(ase.getMessage()); 
       slf4jLogger.error(ase.getStackTrace()); 
      } 
      catch (Exception e) 
      { 
       //e.printStackTrace(); 
       slf4jLogger.error(e); 
       slf4jLogger.error(e.getMessage()); 
       slf4jLogger.error(e.getStackTrace()); 
      } 
} 

这里是我的记录器:

======================Begin Saving values to DynamoDB=================================================== 
Saving Score: 86 
Saving Score: 92 
Saving Score: 32 
Saving Score: 65 

Saving device_model: Nexus S 
Saving api_key: testApp 
Saving user_id: 10f353a0-c6da-44ee-a9cb 
Saving registrationId: APA91bFOz1lCFr1dT_s-HH-TatpF1XOIQ6GF846EMfmTjd_x-wARKy1zyEwr86UXfL9K1Xm8_PHpOKVuxmUXLKXHVKurXwe75EPmnBJolvS0 

Saving latitude: 12.9563 
Saving latitude: 12.9565 
Saving latitude: 12.9567 
Saving latitude: 12.9511 

Saving longitude: 12.9563 
Saving longitude: 12.9562 
Saving longitude: 12.9563 
Saving longitude: 12.912 

Saving accuracyValue: 694.0 
Saving accuracyValue: 611.0 
Saving accuracyValue: 612.0 
Saving accuracyValue: 613.0 

Saving userlocaltym: 11-02-2015 11:20:25 
Saving userlocaltym: 11-02-2015 11:21:26 
Saving userlocaltym: 11-02-2015 11:22:25 
Saving userlocaltym: 11-02-2015 11:25:25 

Saving userTimezoneAsia/Calcutta 

但我能救只有一组。

Score Table items: Score [user_id=10f353a0-c6da-44ee-a9cb, device_model=Nexus S, api_key=testApp, gen_t=1436175254608, score=98, registrationId=APA91bFOz1lCFr1dT_s-HH-TatpF1XOIQ6GF846EMfmTjd_x-wARKy1zyEwr86UXfL9K1Xm8_PHpOKVuxmUXLKXHVKurXwe75EPmnBJolvS0, lat=12.9511, lon=12.912, accuracy=613.0, userLocalTime=11-02-2015 11:25:25, userTimezone=Asia/Calcutta] 
======================End Saving values to DynamoDB=================================================== 

回答

0

除了@ readyornot的回答,我能够从foreach循环改变为for循环解决。所以这里是代码,

//Table name: Score 
//Since array size of all parameters will be same as they are dependent on each other, 
//for eg: 5 scores has 5 latitudes & 5 longitudes etc, 
//I got the size of array and looped that many no.of times. 

       Score item = null; 
       for(int i=0; i<score.length; i++) 
       { 
        long gen_timestamp = Calendar.getInstance().getTimeInMillis(); 
        client = DynamoDBConfig.getAmazonDBClient(); 
        DynamoDBMapper mapper = new DynamoDBMapper(client); 
        item = new Score(); 
        item.setGen_t(gen_timestamp); 
        slf4jLogger.info(i+" Saving gen_timestamp: "+gen_timestamp); 
        item.setDevice_model(device_model); 
        slf4jLogger.info(i+" Saving device_model: "+device_model); 
        item.setApi_key(api_key); 
        slf4jLogger.info(i+" Saving api_key: "+api_key); 
        item.setUser_id(user_id); 
        slf4jLogger.info(i+" Saving user_id: "+user_id); 
        item.setRegistrationId(registrationId); 
        slf4jLogger.info(i+" Saving registrationId: "+registrationId); 
        item.setScore(score[i]); 
        slf4jLogger.info(i+" Saving Score in /receiveUpdateStressScore: "+score[i]); 
        item.setLat(lat[i]); 
        slf4jLogger.info(i+" Saving lat in /receiveUpdateStressScore: "+lat[i]); 
        item.setLon(lon[i]); 
        slf4jLogger.info(i+" Saving lon in /receiveUpdateStressScore: "+lon[i]); 
        item.setAccuracy(accuracy[i]); 
        slf4jLogger.info(i+" Saving accuracy in /receiveUpdateStressScore: "+accuracy[i]); 
        item.setUserLocalTime(userLocalTime[i]); 
        slf4jLogger.info(i+" Saving userLocalTime in /receiveUpdateStressScore: "+userLocalTime[i]); 
        item.setUserTimezone(userTimezone); 
        slf4jLogger.info(i+" Saving userTimezone: "+userTimezone); 
        slf4jLogger.info(i+"Items Saving: "+item); 
        mapper.save(item); 
       } 
       slf4jLogger.info("Score Table items: "+item); 
2

什么是您的DynamoDB评分表散列键(和范围,组合键)?我有一种感觉,你可能会一遍又一遍覆盖同一个项目。

如果表中有一个哈希键,则每个项目在该列中必须具有唯一值。如果表具有散列/范围键,则多个项目在散列列中可以具有相同的值,但是它们的范围值必须不同。更多详情here

+0

非常感谢。你是对的。我的表的Hashkey是gen_time(时间戳),它不在_for_循环中。因此,所有循环的一个gen_time因此**所有值都一遍又一遍地重写相同的项目。**而不是_foreach_循环,我使用_for_循环,因此问题得以解决。再一次感谢你。 :+1 – Chandz