Представление реляционных таблиц в ActionScript 3.0 - PullRequest
0 голосов
/ 20 августа 2010

Я пытаюсь создать гибкую структуру данных (например, реляционную базу данных) для теста в ActionScript 3.0.

У меня есть несколько вопросов, каждый из которых имеет 2 варианта:

Вопросы

| id | alt1    | alt2    | correctAlt |
---------------------------------------
| 0  | Sweden  | Denmark | 1          |
| 1  | Norway  | Finland | 2          |
| 2  | Iceland | Ireland | 1          |

И количество пользователей с уникальными идентификаторами:

Пользователи

| id  | age  | sex  | profession | totalCorrect |
-------------------------------------------------
| A5  | 25   | 0    | "Lorem"    | 0            |              
| A6  | 45   | 1    | "Ipsum"    | 0            | 
| A7  | 32   | 1    | "Dolor"    | 0            |

И каждый пользователь может ответить на вопрос:

Ответы

| question_id | user_id | answer |
----------------------------------
| 0           | A5      | 1      |
| 1           | A6      | 2      |
| 2           | A7      | 1      |

Как я могу представить это в AS3?
И как я могу, когда я собрал все данные, ответить на такие вопросы, как:

а. Сколько пользователей ответили на вопрос 1?
б. Сколько% пользователей, ответивших на вопрос 1, были правы?
с. И как я могу суммировать количество правильных ответов для каждого пользователя и обновить столбец totalCorrect?

Ответы [ 3 ]

0 голосов
/ 20 августа 2010

Независимо от того, используете ли вы базу данных или нет, эти данные все еще можно представить объектами. Вы можете создавать определенные классы.

Вот базовый пример для класса Question.

public class Question
{
  private var _id:int;
  private var _alternatives:Array;
  private var _correctAnswer:int;

  public function Question()
  {
  }

  //----------- Group: Getters & Setters
  // follow the same principle as alternatives for id & correctAnswer

  public function set alternatives(value:Array):void
  { 
      _alternatives = value;
  }

  public function get alternatives():Array
  { 
     return  _alternatives;
  }

  // etc..... 
}

var question1:Question = new Question();
question1.alternatives = ["Sweden" , "Denmark"]
question.correctAnswer = 1;
question.id = 0;

Также возможно передавать параметры конструктору

public class Question
{
  private var _id:int;
  private var _alternatives:Array;
  private var _correctAnswer:int;

  public function Question(id:int , alt:Array, correct:int)
  {
      _id = id;
      _alternatives = alt;
      _correctAnswer = correct;

  }

  var question1:Question = new Question(0 , ["Sweden" , "Denmark"] , 1);

Сделайте нечто подобное для пользователей, затем создайте еще один класс, в котором вы будете манипулировать данными.

Попробуйте найти некоторые ресурсы о классах в целом и объектно-ориентированном программировании в частности.

0 голосов
/ 21 августа 2010

Я потратил время, чтобы разобраться в вашей проблеме более подробно. Я создал три класса в качестве моделей для Вопроса, Пользователя и Ответа и класса AnswerEvent.

Основной класс служит центральной точкой для манипулирования данными. Когда пользователь отвечает на вопрос, его ответ (класс ответа) отправляет событие для информирования основного класса. Ответ имеет свойство пользователя, свойство вопроса и свойство isCorrect, а объект AnswerEvent содержит объект ответа, который можно сохранить в основном классе.

После отправки события ответ сохраняется в массиве ответов. Поскольку каждый ответ содержит как пользовательские данные, так и ответ на вопрос и то, как на него был дан ответ, вы можете использовать этот массив для ответа на ваши вопросы a, b & c.

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

//Inside the main class
private var answers:Array = [];

private function init():void
{
   this.addEventListener(AnswerEvent.ANSWER , answerEventListener );

   var q1:Question = new Question( 0 , ["Sweden" , "Denmark"] , 0 );
   var q2:Question = new Question( 1 , ["Norway" , "Finland"] , 1 );
   var q3:Question = new Question( 2 , ["Iceland" , "Ireland"] , 0 );

   var user1:User = new User( 5 , 25 , 0 , "Lorem"  );
   var user2:User = new User( 6 , 45 , 1 , "Ipsum"  );
   var user3:User = new User( 7 , 32 , 1 , "Dolor"  );

   //if the answer is correct , the totalCorrect property is incremented
   // in the User class, check the Answer class below for an explanation of the 
   //parameters     
   user1.answer( new Answer( this , user1 , q1 , 1 ));

}

private function answerEventListener(event:AnswerEvent):void
{
   answers.push(event.answer);
   trace( this , event.answer.isCorrect );
   trace( this , event.answer.user.age );
}

Вот модель для класса Ответ, я не добавил получатели из-за недостатка места. AnswerEvent расширяет класс Event и добавляет свойство ответа типа Answer

public class Answer
{
   private var _question:Question;
   private var _answer:int;
   private var _user:User;
   private var _isCorrect:Boolean;

   public function Answer(dispatcher:EventDispatcher , user:User , question:Question , answer:int)
   {
    this._user = user;
    this._question = question;
    this._answer = answer;

    // not essential but will help iterate thru correct answers
    // the _answer property should be _answerIndex really, in order not to be confused 
    // with an Answer object ( quick job ! )        
    if( question.correctAnswer == answer )
     _isCorrect = true;

    // the this keyword corresponds to this answer          
    dispatcher.dispatchEvent( new AnswerEvent(AnswerEvent.ANSWER , this) );
   }
}
0 голосов
/ 20 августа 2010

Я предлагаю вам сохранить эти данные в базе данных SQL .
База данных SQL поможет вам извлечь данные по вашим вопросам.

Если вы используете Air, это должно быть легко, поскольку Air поддерживает SQLite , локальную базу данных.

Если вы разрабатываете файл .swf, вы можете подключиться к базе данных SQL с помощью AMF или с помощью методов POST или GET к серверу, который будет извлекать данные по запросу SQL, отправленному с помощью URLRequest() метод.

Я настоятельно рекомендую использовать базу данных SQL, так как это сделано для вашего типа вопросов.

Вот ваши вопросы, переведенные на SQL

  1. Сколько пользователей ответили на вопрос 1?
    Вы забыли добавить идентификатор в таблицу ответов
    SELECT users.id FROM users, answers, questions WHERE questions.id = 0 AND answers.question_id = questions.id AND answers.answer = questions.correctAlt;
  2. Сколько пользователей ответили на вопрос 1?
    Это можно сделать в двух запросах. Оба вернут количество пользователей. Сначала все пользователи, которые ответили на вопрос. Во-вторых, так же, как и первый вопрос, переведенный.
    SELECT users.id FROM users, answers, questions WHERE questions.id = 0 AND answers.question_id = questions.id;
    SELECT users.id FROM users, answers, questions WHERE questions.id = 0 AND answers.question_id = questions.id AND answers.answer = questions.correctAlt;
  3. Как мне подсчитать количество правильных ответов для каждого пользователя и обновить столбец totalCorrect?
    Вам даже не нужен такой столбец в вашей таблице, поскольку он может быть решен простым запросом.
    SELECT answers.id FROM users, answers, questions WHERE answers.question_id = questions.id;<br />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...