2015-06-12 1 views
0

Я запрограммировал какую-то викторину. Во-первых, пользователи могут задавать вопросы и отвечать на них. Они сохраняются в таблице вопросов/ответов.Где ошибка в моей логике вложенных for-loops с ifs?

Если в этой таблице достаточно записей, можно начать викторину. Викторина проходит через записи в вопросе/таблице ответов, выбирает вопрос случайным образом и задает пользователю вопрос. Его ответ сохраняется в викторине.

Записи в таблице викторины учитывают текущего пользователя, поэтому, если уже есть запись для пользователя (возможно, он уже задан перед вопросом), тогда ответ обновляет запись в таблице викторины , Если пользователю задан вопрос до этого, создается новая запись в таблице викторины.

Большинство из них работает более или менее, но как-то записи в таблице викторины не обновляются, и я не понимаю, почему. Итак, где ошибка в моей логике здесь?

//Creates a list.The user answers the question via radiobuttons. 
//All quiz-entries that match the question_ID get put into the list. 
//Bob and Tim could have answere the same question, 
//so the question_ID could be in there several times 
List<Quiz> tempQuizList = Quiz.find.where().like("question_ID", clickedRadioAnswer.questionID).findList(); 

User currentUser = request().name(); 

if(tempQuizList.size() > 0){ 
    // Go through all entries in the quiz-table 
    for (Quiz quizItem : Quiz.find.all()) { 
     // If the user from the quiz-table entry is the same as the current user 
     if((quizItem.userID).equals(currentUser.email)){ 
      if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){ 
       // If user has answered correctly, update the entry with the user and an interval to postpone the time when the user has to answer the question again 
       Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 5000); 
      } 
      else{ 
       Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 0); 
      } 
     } 
     if(!(quizItem.userID).equals(currentUser.email)){ 
      if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){ 
       Quiz.createAnswer(clickedRadioAnswer, currentUser, 5000); 
      } 
      else{ 
       Quiz.createAnswer(clickedRadioAnswer, currentUser, 0); 
      } 
     } 
    } 
} 
+5

Знаете ли вы о программном обеспечении отладки? Это выглядит точно так же, как проблема, которую легче понять, пройдя ее шаг за шагом - как это делают отладчики. – blagae

+0

Обновление использует 'currentUser.email' create uses' request(). Username() 'не уверен, что он такой же разработан. –

+0

@blagae: Да, но поскольку я использую платформу воспроизведения, это немного сложнее, чем обычно. Чтобы узнать, что происходит в БД, я должен ввести 'активатор' ... затем' h2-browser'. Но для запуска отладчика я не могу использовать 'активатор', а затем' -jvm-debug 9999 run', так как он не распознает это как команду. Поэтому я запускаю сеанс отладки, не видя свою БД ... но в отладчике иногда зависает моя система, когда я нажимаю 'F6' или пытаюсь перейти в класс-файлы. Поэтому я в основном использую 'System.out.println (...)', чтобы посмотреть, что происходит, я отредактировал их из моего вопроса. – hamena314

ответ

0

Я нашел довольно грязный раствор:

В моей для петли я спрашиваю, если пользователь с вопросом в БД такой же, как тот, который в настоящее время вошли в систему Если я. добавить еще .like() в мой список, моя структура становится способ проще:

List<Quiz> tempQuizList = Quiz.find.where() 
.like("question_ID", clickedRadioAnswer.questionID).findList(); 

становится:

List<Quiz> tempQuizList = Quiz.find.where() 
.like("question_ID", clickedRadioAnswer.questionID) 
.like("user_id", currentUser.email).findList(); 

С этой второй частью моего большим, если агрегатирования ISNT необходимого больше, поскольку пользователь в 100% текущий пользователе (иначе этот вопрос не был бы занесен в список):

if(tempQuizList.size() > 0){    
    if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){ 
     Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 5000); 
    } 
    if(!clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){ 
     Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 0); 
    } 
} 

// Quiz is empty or user has no quizquestion open 
if(tempQuizList.size() == 0){ 
    if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){ 
    Quiz.createAnswer(clickedRadioAnswer, currentUser.email, 5000); 
} 
else{ 
    Quiz.createAnswer(clickedRadioAnswer, currentUser.email, 0); 
} 

Я попытался используйте отладчик, но обнаружил, что на самом деле довольно сложно увидеть, где была ошибка. Вместо этого я поднялся с другом и объяснил ему, что я делаю. Затем он указал, что для цикла слишком много. Вместе мы нашли решение с двойным. Это не выглядит красиво, но получить работу.