ORMLite на Android: получение исключения NullPointerException при попытке чтения данных из объекта

В моем приложении у меня есть несколько постоянных моделей, и в одном случае я получаю исключение при попытке получить данные с помощью соответствующего геттера. Но в БД есть данные, и я понятия не имею, почему геттер ничего не возвращает. Класс ответа:

@DatabaseTable
@JsonRootName(value = "answer")
public class Answer {
    public Answer() {}        

    @DatabaseField(generatedId = true, columnName = "_id")
    @JsonIgnore
    private Integer id;

    @DatabaseField
    @JsonProperty(value = "id")
    private Integer answer_id;

    @DatabaseField(dataType = DataType.LONG_STRING)
    private String text;
    // some other fields and setters/getters
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

Класс вопросов:

@DatabaseTable
public class Question extends BaseDaoEnabled implements Serializable {

    private static final long serialVersionUID = -7587892134579897L;

    public Question() {
    }
    @DatabaseField(foreign = true, foreignAutoRefresh = true)
    private Answer answer;
}

Класс квеста:

@DatabaseTable(tableName = "quests")
@JsonRootName(value = "quest")
public class Quest {

@DatabaseField(allowGeneratedIdInsert = true, generatedId = true, columnName = "_id")
private Integer id;

@DatabaseField(dataType = DataType.DATE_STRING)
Date created_at;

@DatabaseField(foreign = true)
private Survey survey;

@ForeignCollectionField(eager = false, orderColumnName = "question_id")
public Collection<Question> questions;

Создание ответа:

  answer.setText(input.getText().toString());
  try {
      if (answer.getId() == null) {
          DBHelperFactory.GetHelper().getAnswersDao().create(answer);
          question.setAnswer(answer);
          DBHelperFactory.GetHelper().getQuestionsDao().update(question);
      } else  {
          DBHelperFactory.GetHelper().getAnswersDao().update(answer);
      }
      Toast.makeText(this.getActivity(), "Answer saved", 5).show();
      listener.nextQuestion();
  } catch (SQLException e) {
      Log.e(LOG_KEY, "Create failed", e);
  }

И сбойный код (квест передается функции, работающей в фоновом режиме)

for (Question question : quest.questions) {
    if (question.getAnswer() != null) {
         Log.d(LOG_KEY, question.getId().toString());
         Log.d(LOG_KEY, question.getAnswer().getId().toString());
         Log.d(LOG_KEY, question.getAnswer().getText());
         // NullPointerException for getText().
    }
}

getAnswer() действительно возвращает ответ. Данные в БД сохранились. Но getText() терпит неудачу. Может ли кто-нибудь помочь мне выяснить, где я ошибаюсь?


person Vlad Bogomolov    schedule 11.01.2013    source источник
comment
где вы устанавливаете текст ответа?   -  person DmitryK    schedule 11.01.2013
comment
о, я вижу, вы уверены, что answer.setText(input.getText().toString()); получает выполняется правильно?   -  person DmitryK    schedule 11.01.2013
comment
Да, потому что, когда я сбрасываю базу данных с устройства (эмулятора), посмотрите, что именно она содержит, я вижу добавленные данные.   -  person Vlad Bogomolov    schedule 11.01.2013
comment
Как вы запрашиваете quest. Можете ли вы показать этот код? Также вам не нужно делать update(...) после создания.   -  person Gray    schedule 11.01.2013
comment
Добавлен код квеста. Экземпляр квеста передается в функцию. Почему обновление не требуется после установки ссылки на ответ? Могут ли возникнуть проблемы с типами данных?   -  person Vlad Bogomolov    schedule 11.01.2013
comment
В конце концов, когда я изменил тип данных с LONG_STRING на String, проблема решилась. Грей, это может быть как-то связано с неработающей поддержкой LONG_STRING под Android (вопрос №36 закрыт на SF)? Я использую ORMlite версии 4.42. Создать соответствующий вопрос?   -  person Vlad Bogomolov    schedule 12.01.2013


Ответы (1)


Суть в том, что @DatabaseField(dataType = DataType.LONG_STRING) работает странно, и мне не удалось заставить его работать. После переключения обратно на VARCHAR проблема исчезла.

person Vlad Bogomolov    schedule 15.01.2013