gpt4 book ai didi

android - 使用 DynamoDB SDK 获取 AWS DynamoDB Number 数据类型

转载 作者:行者123 更新时间:2023-11-29 01:17:18 25 4
gpt4 key购买 nike

我正在使用 AWS Android DynamoDB SDK,最近我遇到了一个问题,但仍然无法修复。尝试获取我的 DynamoDB 的“已创建”值时,我收到以下错误消息:"Expected S in value {N: 1449848553974,}"。到目前为止,我从 AWS 文档中了解到,'N' 代表数据类型 Number

这是类的代码:

@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 中看到它是一个类型为“Number”的 Unix Timestamp 值。

enter image description here

时间戳类:对于 Timestamp 类,我只是实现了 DynamoDBMarshaller 接口(interface)并放置了一些日志文件来检查是否相应地接收到数据。

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;
}

提前致谢。

最佳答案

@Mike:奇怪的是,同一个系统存储的值有时与 String 有时与 Number 相同。这就是为什么我与网络开发人员交谈以解决此问题,以便网站和 Android 应用程序以相同的数据类型存储时间戳。我设法解决了这个问题。

解决方案:在进行了一些研究和实验之后,我解决了这个问题。根据 SDK 文档值存储,Number 被认为是字符串,但在使用字符串时我无法解决这个问题,因为它期望的是 int 而不是 字符串。此外,我设法拿到一本书(DynamoDB Cookbook),其中包含一个示例,该示例从 DynamoBD 查询数字类型的数据,并且他们使用 int 而不是 Strings .
我的实验如下:

将 Android 应用程序中的预期数据类型设置为 int 并在 DynamoDB 后端上一次删除一个字符,在删除 3 个字符后它起作用了。

当前数值:1449848553974

接受的新数值:1449848553

意味着必须删除 3 个字符才能使其在其他单词 1449848553974/1000 上起作用。在对时间戳进行更深入的研究后,我得出结论,时间戳以毫秒而不是秒为单位存储,将其转换为秒:

Seconds = milliseconds/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 还期望 String 而不是 int 的原因。

我的解决方案是将时间戳从类型 Number 替换为 String,或者如果将其保留为 Number 但将其从毫秒转换为秒。

这解决了我的问题,如果有人有其他解决方案,我非常欢迎,因为我是新手。

关于android - 使用 DynamoDB SDK 获取 AWS DynamoDB Number 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38798755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com