2016-08-05 4 views
1

Я нахожусь в SDK Android DynamoDB SDK Android, и в последнее время я столкнулся с проблемой и до сих пор не могу ее исправить. При попытке получить значение «Создано» моего DynamoDB я получаю следующее сообщение об ошибке: «Ожидаемое значение S в значении {N: 1449848553974,}". Что я знаю до сих пор из документации AWS, является то, что 'N' Подставка для Datatype Номер.Получение типа данных AWS DynamoDB с использованием DynamoDB SDK

Вот код класса:

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

Надежда кто-то может помочь мне с этим вопросом. Я просматриваю интернет, но без положительных результатов.

Update: До сих пор я могу видеть в DynamoDB это значение Отметка времени Unix типа «Номер».

enter image description here

TimeStamp Класс: Для класса Timestamp я просто реализовать интерфейс 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: Странно, что одна и та же система хранит одно и то же значение, иногда как String, а иногда как Number. Вот почему я говорю с веб-разработчиком, чтобы исправить эту проблему, поэтому веб-сайт и Android-приложение сохраняют метку времени в том же типе данных. И мне удается решить проблему.

После проведения некоторых исследований и эксперимента я решаю проблему. В соответствии с хранилищем документации SDK как Номер считаются String, но я не мог решить эту проблему при использовании строк, так как ожидал int, а не String. Кроме того, мне удается получить книгу (DynamicDB Cookbook), которая содержит пример, который запрашивает данные типа Numbers из DynamoBD, и они использовали int, а не Строки.
Мой эксперимент был следующим:

Установите тип данных ожиданий в Android-приложении как int, а на back-end DynamoDB удалите один символ за раз и после удаления 3 символов он работает.

Текущее значение Номер:

Новый номер значение, которое было принято: 1449848553

Это означает, что 3-х символов должны быть удалены в порядке для того, чтобы работать над другими словами 1449848553974/1000. После проведения более глубокое исследования о временных метках я пришел к выводу, что метка время хранится в миллисекундах, а не секунды, чтобы преобразовать его в секунды:

секунды = мс/1000

После просмотра, почему приложение не принимает значение как тип int Я пришел к выводу, что я имел дело с «переполнением целого числа», и благодаря этому DynamoDBMapper ожидал настраиваемый тип, поскольку превысил максимальное значение целого числа.

Согласно Java2s значение максимального ИНТ: 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, но преобразовать ее в миллисекундах в секунды.

Это решает мою проблему, если у кого есть другое решение, это более чем приятно, так как я новичок в этом.

0

Когда вы используете пользовательский маршаллер DynamoDB, данные сериализуются как строка, а не число. Это ограничение того, как реализованы пользовательские маршаллеры.

Я не уверен, как именно ваш класс TimeStampConverter реализует сериализацию и десериализацию, но определенно он ожидает, что временная метка будет сериализована в строку, так что: {S: "1449848553974",}. Вопрос в том, откуда взялось значение {N: 1449848553974,}? Я предполагаю, что он не был сериализован классом TimeStampConverter.

+0

Я обновляю код двумя соответствующими классами – Melchior

+0

Привет @Melchior - это числовые метки времени, вставленные другой системой в вашу таблицу? Кажется, что у вас нет контроля над типом данных этих временных меток - я правильно понял? –

Смежные вопросы