2016-08-05 162 views
1

我參加了AWS Android DynamoDB SDK,最近遇到問題,仍無法解決問題。 嘗試獲取DynamoDB的「創建」值時,出現以下錯誤消息:「期望值S {N:1449848553974,}」。 到目前爲止,我從AWS文檔中得知的是'N'表示數據類型號碼使用DynamoDB SDK獲取AWS DynamoDB號碼數據類型

下面是類代碼:

@DynamoDBTable(tableName = "dev.records_log") 
public class Record 
{ 
private Created created; 

@DynamoDBAttribute(attributeName = "created") 
@DynamoDBMarshalling(marshallerClass = TimeStampConverter.class) 
public Created getTimestamp_created() 
{ 
    return created; 
} 

@DynamoDBMarshalling(marshallerClass = TimeStampConverter.class) 
public void setRecord_created(Created created) { 
     this.created = created; 
    } 

希望有人可以幫助我這個問題。我通過互聯網瀏覽,但沒有積極的結果。

更新: 到目前爲止,我可以在DynamoDB看到它的類型是「數字」的Unix時間戳值。

enter image description here

時間戳類別: 對於時間戳類我只是實現DynamoDBMarshaller接口,並把一些日誌文件,以檢查是否相應地接收到的數據。

public class TimeStampConverter implements DynamoDBMarshaller<AdditionalInformation> 
{ 

@Override 
public String marshall(Created created) 
{ 
    Log.i("LOG","Marshall create value: "+created); 
    return null; 
} 

@Override 
public Created unmarshall(Class<Created> clazz, String obj) { 

    Log.i("LOG","Created unmarshall "); 
    Created date_time_created = new Created(); 
    Log.i("LOG","date_time_created "+date_time_created); 
    Log.i("LOG","unmarshall s value "+s); 
    Log.i("LOG","unmarshall s length "+s.length()); 
    try{ 
     if (s != null && s.length() != 0) 
     { 
      String[] data = s.split(" "); 
      date_time_created.setDate_created(data[0].trim()); 
      date_time_created.setTime_created(data[1].trim()); 

     } 
    }catch (Exception e) 
    { 
     Log.i("LOG","unmarshall error "+e.getMessage()); 
     e.printStackTrace(); 
    } 

    return date_time_created; 
} 
} 

創建的類:

public class Created 
{ 
    private String date_created; 
    private String time_created; 

public String getDate_created() { 
    return date_created; 
} 

public void setDate_created(String date_created) { 
    this.date_created = date_created; 
} 

public String getTime_created() { 
    return time_created; 
} 

public void setTime_created(String time_created) { 
    this.time_created = time_created; 
} 

}

在此先感謝。

回答

0

@Mike:奇怪的是,相同的系統有時存儲相同的值有時作爲字符串,有時存儲數字。這就是爲什麼我與Web開發人員解決此問題的原因,以便網站和Android應用程序將Timestamp存儲在相同的數據類型中。我設法解決這個問題。

解決方案: 經過一些研究和實驗,我解決了這個問題。根據SDK文檔價值商店號碼被視爲字符串,但我不能解決這個問題時使用字符串,因爲它期待INT而不是字符串。此外,我設法找到一本書(DynamoDB Cookbook),其中包含一個從DynamoBD中查詢數字類型數據的示例,它們使用int而不是字符串
我的實驗如下:

在Android應用程序中將expect數據類型設置爲int,並在DynamoDB後端一次刪除一個字符,並刪除3個字符後運行。

當前號碼值:

被接受的新號碼值:1449848553

意思就是說3個字符必須在訂單爲它在換句話說1000分之1449848553974工作中移除。正在進行關於時間戳的深入研究後,我來到了該時間戳存儲在毫秒,而不是秒結束時,將其轉換爲秒:

秒=毫秒/ 1000

尋找爲什麼應用之後不接受值作爲類型int我得出結論,我正在處理'整數溢出',並且由於此,DynamoDBMapper期望自定義類型,因爲超過了整數的最大值。

根據Java2s最大int值是:2^31-1

源:http://www.java2s.com/Tutorial/Java/0040__Data-Type/IntegerMAXMINVALUE.htm

如果我們只挑選作爲例子給出的值的字符的量在上述連結並將其與我們的價值:

INT最大值:2147483647(10個字符)

我的值:1446738459378(13個字符)

正如我可以看到它超過最大值,這就是爲什麼Java不會除了這個數值作爲int和DynamoDBMarshalling也期望字符串,而不是int。

我的解決方案是將Number類型的時間戳替換爲String,或者將其保存爲Number,但將其從毫秒轉換爲秒。

這解決了我的問題,如果任何人有另一種解決方案,這是非常歡迎,因爲我是新手。

0

當您使用自定義DynamoDB編組器時,數據被序列化爲字符串,而不是數字。這是自定義編組器實施方式的限制。

我不確定您的TimeStampConverter類是如何實現序列化和反序列化的,但絕大多數情況下,它期望找到序列化爲一個字符串的時間戳,如下所示:{S: "1449848553974",}。問題是,{N: 1449848553974,}值從何而來?我猜測它沒有被TimeStampConverter課程序列化。

+0

我用兩個對應的類更新代碼 – Melchior

+0

Hi @Melchior - 是由不同系統插入到您的表中的數字時間戳嗎?看起來你不能控制這些時間戳的數據類型 - 我是否正確? –