SQLite для викторины с таблица вопросов и таблица категорий


Редактировать: я изменил мой подход. Я пытаюсь добавить категории для моей существующей базы данных SQLite викторины. Это мой подход, что вы думаете об этом? Как вы считаете ключа ограничение внешнего надо? Я всего на SQLite нуб и это первый раз, когда я использовать внешний ключ.

public class QuizDbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyAwesomeQuiz.db";
private static final int DATABASE_VERSION = 1;

private SQLiteDatabase db;

public QuizDbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    this.db = db;

    final String SQL_CREATE_CATEGORIES_TABLE = "CREATE TABLE " +
            CategoriesTable.TABLE_NAME + "( " +
            CategoriesTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            CategoriesTable.COLUMN_NAME + " TEXT " +
            ")";

    final String SQL_CREATE_QUESTIONS_TABLE = "CREATE TABLE " +
            QuestionsTable.TABLE_NAME + " ( " +
            QuestionsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            QuestionsTable.COLUMN_QUESTION + " TEXT, " +
            QuestionsTable.COLUMN_OPTION1 + " TEXT, " +
            QuestionsTable.COLUMN_OPTION2 + " TEXT, " +
            QuestionsTable.COLUMN_OPTION3 + " TEXT, " +
            QuestionsTable.COLUMN_ANSWER_NR + " INTEGER, " +
            QuestionsTable.COLUMN_DIFFICULTY + " TEXT, " +
            QuestionsTable.COLUMN_CATEGORY + " INTEGER, " +
            "FOREIGN KEY(" + QuestionsTable.COLUMN_CATEGORY + ") REFERENCES " +
            CategoriesTable.TABLE_NAME + "(" + QuestionsTable._ID + ")" +
            ")";

    db.execSQL(SQL_CREATE_CATEGORIES_TABLE);
    db.execSQL(SQL_CREATE_QUESTIONS_TABLE);
    fillCategoriesTable();
    fillQuestionsTable();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + QuestionsTable.TABLE_NAME);
    onCreate(db);
}

@Override
public void onConfigure(SQLiteDatabase db) {
    super.onConfigure(db);
    db.setForeignKeyConstraintsEnabled(true);
}

private void fillQuestionsTable() {
    Question q1 = new Question("Easy: A is correct",
            "A", "B", "C", 1, Question.DIFFICULTY_EASY, 1);
    addQuestion(q1);
    Question q2 = new Question("Medium: B is correct",
            "A", "B", "C", 2, Question.DIFFICULTY_MEDIUM, 2);
    addQuestion(q2);
    Question q3 = new Question("Medium: C is correct",
            "A", "B", "C", 3, Question.DIFFICULTY_MEDIUM, 3);
    addQuestion(q3);
    Question q4 = new Question("Hard: A is correct",
            "A", "B", "C", 1, Question.DIFFICULTY_HARD, 4);
    addQuestion(q4);
    Question q5 = new Question("Hard: B is correct",
            "A", "B", "C", 2, Question.DIFFICULTY_HARD, 5);
    addQuestion(q5);
    Question q6 = new Question("Hard: C is correct",
            "A", "B", "C", 3, Question.DIFFICULTY_HARD, 6);
    addQuestion(q6);
}

private void addQuestion(Question question) {
    ContentValues cv = new ContentValues();
    cv.put(QuestionsTable.COLUMN_QUESTION, question.getQuestion());
    cv.put(QuestionsTable.COLUMN_OPTION1, question.getOption1());
    cv.put(QuestionsTable.COLUMN_OPTION2, question.getOption2());
    cv.put(QuestionsTable.COLUMN_OPTION3, question.getOption3());
    cv.put(QuestionsTable.COLUMN_ANSWER_NR, question.getAnswerNr());
    cv.put(QuestionsTable.COLUMN_DIFFICULTY, question.getDifficulty());
    cv.put(QuestionsTable.COLUMN_CATEGORY, question.getCategory());
    db.insert(QuestionsTable.TABLE_NAME, null, cv);
}

private void fillCategoriesTable() {
    Category c1 = new Category("Cat 1");
    addCategory(c1);
    Category c2 = new Category("Cat 2");
    addCategory(c2);
    Category c3 = new Category("Cat 3");
    addCategory(c3);
}

private void addCategory(Category category) {
    ContentValues cv = new ContentValues();
    cv.put(CategoriesTable.COLUMN_NAME, category.getName());
    db.insert(CategoriesTable.TABLE_NAME, null, cv);
}


public List<Category> getAllCategories() {
    ArrayList<Category> allCategories = new ArrayList<>();
    db = getReadableDatabase();
    Cursor c = db.rawQuery("SELECT * FROM " + CategoriesTable.TABLE_NAME, null);

    if (c.moveToFirst()) {
        do {
            Category category = new Category();
            category.setId(c.getInt((c.getColumnIndex(CategoriesTable._ID))));
            category.setName(c.getString(c.getColumnIndex(CategoriesTable.COLUMN_NAME)));
            allCategories.add(category);
        } while (c.moveToNext());
    }

    c.close();

    return allCategories;
}

public ArrayList<Question> getAllQuestions() {
    ArrayList<Question> questionList = new ArrayList<>();
    db = getReadableDatabase();
    Cursor c = db.rawQuery("SELECT * FROM " + QuestionsTable.TABLE_NAME, null);

    if (c.moveToFirst()) {
        do {
            Question question = new Question();
            question.setQuestion(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_QUESTION)));
            question.setOption1(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION1)));
            question.setOption2(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION2)));
            question.setOption3(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION3)));
            question.setAnswerNr(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER_NR)));
            question.setDifficulty(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_DIFFICULTY)));
            questionList.add(question);
        } while (c.moveToNext());
    }

    c.close();
    return questionList;
}

public ArrayList<Question> getQuestions(String difficulty) {
    ArrayList<Question> questionList = new ArrayList<>();
    db = getReadableDatabase();

    String[] selectionArgs = new String[]{difficulty};
    Cursor c = db.rawQuery("SELECT * FROM " + QuestionsTable.TABLE_NAME +
            " WHERE " + QuestionsTable.COLUMN_DIFFICULTY + " = ?", selectionArgs);

    if (c.moveToFirst()) {
        do {
            Question question = new Question();
            question.setQuestion(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_QUESTION)));
            question.setOption1(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION1)));
            question.setOption2(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION2)));
            question.setOption3(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION3)));
            question.setAnswerNr(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER_NR)));
            question.setDifficulty(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_DIFFICULTY)));
            questionList.add(question);
        } while (c.moveToNext());
    }

    c.close();
    return questionList;
}
}


184
2
задан 8 апреля 2018 в 04:04 Источник Поделиться
Комментарии
1 ответ

Это всегда желательно иметь инт как FK. Таким образом, вы можете изменить название категории, не удаляя все отношения (в данном случае, на их вопросы). Вы также должны думать, если это имеет смысл вопрос с категорией, которая больше не существует.

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

Хотя это трудно в начале, вы должны забыть об использовании SQLite, MySQL или любой СУБД вы используете. Вы наверное думаете, что в вашей модели и то, что нужно в вашем бизнесе. Имея это ясно, это будет проще для вас, чтобы найти перевод на SQLite.

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

2
ответ дан 9 апреля 2018 в 06:04 Источник Поделиться