Skip to main content
Bumped by Community user
Bumped by Community user
Bumped by Community user
Rollback to Revision 2
Source Link
Zeta
  • 19.6k
  • 2
  • 57
  • 90

Edit: I changed my approach. I am trying to add categorieswant to my existing SQLiteshow you the SQLiteOpenHelper and Contract class for a little quiz app I made for practicing purposes. This is myI have 3 tables for 3 different categories. The approach works, what do you think about it? Dobut I wonder if I should remove redundancy. As you think the foreign key restrictioncan see, there is necessary? I am a total SQLite nooblot of similar code for creating and it's the first timefilling those tables, but I use a foreign keyfeel like it would be confusing if I would combine these methods into 1.

Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1?

What do you think?

Contract:

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

    private SQLiteDatabaseQuizContract() db;{
    }

    public QuizDbHelper(Contextstatic context)class Category1Table implements BaseColumns {
    super(context, DATABASE_NAME, null, DATABASE_VERSION); public static final String TABLE_NAME = "category1_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category2Table implements BaseColumns {
        public static final String TABLE_NAME = "category2_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category3Table implements BaseColumns {
        public static final String TABLE_NAME = "category3_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }
}

SQLiteOpenHelper:

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

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

    final String SQL_CREATE_CATEGORIES_TABLE = "CREATE TABLE " +
            CategoriesTable.TABLE_NAME +public "QuizDbHelper(Context "context) +{
            CategoriesTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENTsuper(context, " +
            CategoriesTable.COLUMN_NAME + " TEXTDATABASE_NAME, "null, +DATABASE_VERSION);
            ")";}

    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, " +@Override
           public "FOREIGNvoid KEYonCreate(" + QuestionsTable.COLUMN_CATEGORY +SQLiteDatabase "db) REFERENCES " +{
            CategoriesTable.TABLE_NAME + "(" + QuestionsTablethis._ID + ")" +
          db = ")";db;

    db    final String SQL_CREATE_CAT1_TABLE = "CREATE TABLE " +
                Category1Table.execSQLTABLE_NAME + " (SQL_CREATE_CATEGORIES_TABLE); " +
    db            Category1Table.execSQL(SQL_CREATE_QUESTIONS_TABLE);_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
    fillCategoriesTable();            Category1Table.COLUMN_QUESTION + " TEXT, " +
    fillQuestionsTable();            Category1Table.COLUMN_OPTION1 + " TEXT, " +
}                Category1Table.COLUMN_OPTION2 + " TEXT, " +
                Category1Table.COLUMN_OPTION3 + " TEXT, " +
                Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

@Override        final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +
public void onUpgrade              Category2Table.TABLE_NAME + " (SQLiteDatabase db" +
                Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, int" oldVersion+
                Category2Table.COLUMN_QUESTION + " TEXT, int" newVersion)+
 {               Category2Table.COLUMN_OPTION1 + " TEXT, " +
    db            Category2Table.execSQL("DROPCOLUMN_OPTION2 TABLE+ IF" EXISTSTEXT, " + 
 QuestionsTable               Category2Table.TABLE_NAME);COLUMN_OPTION3 + " TEXT, " +
    onCreate(db);            Category2Table.COLUMN_ANSWER_NR + " INTEGER" +
}                ")";

@Override        final String SQL_CREATE_CAT3_TABLE = "CREATE TABLE " +
public void onConfigure              Category3Table.TABLE_NAME + " (SQLiteDatabase db)" {+
    super            Category3Table.onConfigure(db);_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
    db            Category3Table.setForeignKeyConstraintsEnabled(true);COLUMN_QUESTION + " TEXT, " +
}                Category3Table.COLUMN_OPTION1 + " TEXT, " +
                Category3Table.COLUMN_OPTION2 + " TEXT, " +
                Category3Table.COLUMN_OPTION3 + " TEXT, " +
                Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

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

private void addQuestion(Question question) {@Override
    ContentValues cv =public newvoid ContentValuesonUpgrade();
 SQLiteDatabase db, int cv.put(QuestionsTable.COLUMN_QUESTIONoldVersion, question.getQuestion()int newVersion); {
    cv.put(QuestionsTable.COLUMN_OPTION1, question   db.getOption1execSQL());
"DROP TABLE IF EXISTS cv.put(QuestionsTable.COLUMN_OPTION2," question+ Category1Table.getOption2()TABLE_NAME);
    cv.put(QuestionsTable.COLUMN_OPTION3, question   db.getOption3execSQL());
"DROP TABLE IF EXISTS cv.put(QuestionsTable.COLUMN_ANSWER_NR," question+ Category2Table.getAnswerNr()TABLE_NAME);
    cv.put(QuestionsTable.COLUMN_DIFFICULTY, question   db.getDifficultyexecSQL());
"DROP TABLE IF EXISTS cv.put(QuestionsTable.COLUMN_CATEGORY," question+ Category3Table.getCategory()TABLE_NAME);
    db.insert(QuestionsTable.TABLE_NAME, null, cv  onCreate(db);
    }

    private void fillCategoriesTablefillCategory1Table() {
    Category c1   Question q1 = new CategoryQuestion("Cat"(C1) 1"A is correct", "A", "B", "C", 1);
    addCategory    addQuestionToCategory1(c1q1);
    Category c2   Question q2 = new CategoryQuestion("Cat"(C1) 2"B is correct", "A", "B", "C", 2);
    addCategory    addQuestionToCategory1(c2q2);
    Category c3   Question q3 = new CategoryQuestion("Cat"(C1) 3"C is correct", "A", "B", "C", 3);
    addCategory    addQuestionToCategory1(c3q3);
    }

    private void addCategoryfillCategory2Table(Category category) {
    ContentValues cv   Question q1 = new ContentValuesQuestion("(C2) A is correct", "A", "B", "C", 1);
    cv.put    addQuestionToCategory2(CategoriesTable.COLUMN_NAMEq1);
        Question q2 = new Question("(C2) B is correct", category.getName"A", "B", "C", 2);
        addQuestionToCategory2(q2);
        Question q3 = new Question("(C2) C is correct", "A", "B", "C", 3);
    db.insert    addQuestionToCategory2(CategoriesTable.TABLE_NAMEq3);
        Question q4 = new Question("(C2) A is correct again", null"A", cv"B", "C", 1);
        addQuestionToCategory2(q4);
    }

    private void fillCategory3Table() {
        Question q1 = new Question("(C3) A is correct", "A", "B", "C", 1);
        addQuestionToCategory3(q1);
        Question q2 = new Question("(C3) B is correct", "A", "B", "C", 2);
        addQuestionToCategory3(q2);
        Question q3 = new Question("(C3) C is correct", "A", "B", "C", 3);
        addQuestionToCategory3(q3);
        Question q4 = new Question("(C3) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory3(q4);
        Question q5 = new Question("(C3) B is correct again", "A", "B", "C", 2);
        addQuestionToCategory3(q5);
    }

public List<Category> getAllCategories  private void addQuestionToCategory1(Question question) {
    ArrayList<Category> allCategories   ContentValues cv = new ArrayList<>ContentValues();
    db = getReadableDatabase  cv.put(Category1Table.COLUMN_QUESTION, question.getQuestion());
    Cursor c = db cv.rawQueryput("SELECTCategory1Table.COLUMN_OPTION1, *question.getOption1());
 FROM " + CategoriesTable    cv.put(Category1Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category1Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category1Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category1Table.TABLE_NAME, null, cv);
    }

    ifprivate (c.moveToFirstvoid addQuestionToCategory2()Question question) {
        doContentValues {cv = new ContentValues();
        cv.put(Category2Table.COLUMN_QUESTION, question.getQuestion());
   Category category = new Category cv.put(Category2Table.COLUMN_OPTION1, question.getOption1());
            categorycv.setIdput(cCategory2Table.getInt((cCOLUMN_OPTION2, question.getColumnIndexgetOption2(CategoriesTable._ID))));
            categorycv.setNameput(cCategory2Table.getString(cCOLUMN_OPTION3, question.getColumnIndexgetOption3(CategoriesTable.COLUMN_NAME)));
           cv.put(Category2Table.COLUMN_ANSWER_NR, allCategoriesquestion.addgetAnswerNr(category));
        } while (cdb.moveToNextinsert()Category2Table.TABLE_NAME, null, cv);
    }

    cprivate void addQuestionToCategory3(Question question) {
        ContentValues cv = new ContentValues();
        cv.closeput(Category3Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category3Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category3Table.TABLE_NAME, null, cv);
    }

    returnpublic allCategories;ArrayList<Question> getAllCategory1Questions() {
}        ArrayList<Question> questionList = new ArrayList<>();
        db = getReadableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM " + Category1Table.TABLE_NAME, null);

public ArrayList<Question> getAllQuestions      if (c.moveToFirst()) {
    ArrayList<Question> questionList       do {
                Question question = new ArrayList<>Question();
    db = getReadableDatabase          question.setQuestion(c.getString(c.getColumnIndex(Category1Table.COLUMN_QUESTION)));
    Cursor            question.setOption1(c.getString(c.getColumnIndex(Category1Table.COLUMN_OPTION1)));
 = db              question.rawQuerysetOption2("SELECTc.getString(c.getColumnIndex(Category1Table.COLUMN_OPTION2)));
 * FROM " + QuestionsTable           question.TABLE_NAME,setOption3(c.getString(c.getColumnIndex(Category1Table.COLUMN_OPTION3)));
 null               question.setAnswerNr(c.getInt(c.getColumnIndex(Category1Table.COLUMN_ANSWER_NR)));
                questionList.add(question);
            } while (c.moveToNext());
        }

    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.addclose(question);
        } whilereturn (c.moveToNext());questionList;
    }

    c.close();
    return questionList;
}

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

    String[] selectionArgs   if (c.moveToFirst()) {
            do {
                Question question = new String[]{difficulty}Question();
    Cursor            question.setQuestion(c.getString(c.getColumnIndex(Category2Table.COLUMN_QUESTION)));
 = db              question.rawQuerysetOption1("SELECTc.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION1)));
 * FROM " + QuestionsTable           question.TABLE_NAMEsetOption2(c.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION2)));
 +               question.setOption3(c.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION3)));
            " WHERE " + QuestionsTablequestion.COLUMN_DIFFICULTYsetAnswerNr(c.getInt(c.getColumnIndex(Category2Table.COLUMN_ANSWER_NR)));
 + " = ?", selectionArgs           questionList.add(question);
            } while (c.moveToNext());
        }

    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.addclose(question);
        } whilereturn (c.moveToNext());questionList;
    }

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

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

        c.close();
        return questionList;
    }
}

Edit: I changed my approach. I am trying to add categories to my existing SQLite quiz. This is my approach, what do you think about it? Do you think the foreign key restriction is necessary? I am a total SQLite noob and it's the first time I use a foreign key.

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

I want to show you the SQLiteOpenHelper and Contract class for a little quiz app I made for practicing purposes. I have 3 tables for 3 different categories. The approach works, but I wonder if I should remove redundancy. As you can see, there is a lot of similar code for creating and filling those tables, but I feel like it would be confusing if I would combine these methods into 1.

Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1?

What do you think?

Contract:

public final class QuizContract {

    private QuizContract() {
    }

    public static class Category1Table implements BaseColumns {
        public static final String TABLE_NAME = "category1_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category2Table implements BaseColumns {
        public static final String TABLE_NAME = "category2_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category3Table implements BaseColumns {
        public static final String TABLE_NAME = "category3_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }
}

SQLiteOpenHelper:

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

    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_CAT1_TABLE = "CREATE TABLE " +
                Category1Table.TABLE_NAME + " ( " +
                Category1Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category1Table.COLUMN_QUESTION + " TEXT, " +
                Category1Table.COLUMN_OPTION1 + " TEXT, " +
                Category1Table.COLUMN_OPTION2 + " TEXT, " +
                Category1Table.COLUMN_OPTION3 + " TEXT, " +
                Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +
                Category2Table.TABLE_NAME + " ( " +
                Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category2Table.COLUMN_QUESTION + " TEXT, " +
                Category2Table.COLUMN_OPTION1 + " TEXT, " +
                Category2Table.COLUMN_OPTION2 + " TEXT, " + 
                Category2Table.COLUMN_OPTION3 + " TEXT, " +
                Category2Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT3_TABLE = "CREATE TABLE " +
                Category3Table.TABLE_NAME + " ( " +
                Category3Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category3Table.COLUMN_QUESTION + " TEXT, " +
                Category3Table.COLUMN_OPTION1 + " TEXT, " +
                Category3Table.COLUMN_OPTION2 + " TEXT, " +
                Category3Table.COLUMN_OPTION3 + " TEXT, " +
                Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        db.execSQL(SQL_CREATE_CAT1_TABLE);
        db.execSQL(SQL_CREATE_CAT2_TABLE);
        db.execSQL(SQL_CREATE_CAT3_TABLE);
        fillCategory1Table();
        fillCategory2Table();
        fillCategory3Table();
    }

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

    private void fillCategory1Table() {
        Question q1 = new Question("(C1) A is correct", "A", "B", "C", 1);
        addQuestionToCategory1(q1);
        Question q2 = new Question("(C1) B is correct", "A", "B", "C", 2);
        addQuestionToCategory1(q2);
        Question q3 = new Question("(C1) C is correct", "A", "B", "C", 3);
        addQuestionToCategory1(q3);
    }

    private void fillCategory2Table() {
        Question q1 = new Question("(C2) A is correct", "A", "B", "C", 1);
        addQuestionToCategory2(q1);
        Question q2 = new Question("(C2) B is correct", "A", "B", "C", 2);
        addQuestionToCategory2(q2);
        Question q3 = new Question("(C2) C is correct", "A", "B", "C", 3);
        addQuestionToCategory2(q3);
        Question q4 = new Question("(C2) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory2(q4);
    }

    private void fillCategory3Table() {
        Question q1 = new Question("(C3) A is correct", "A", "B", "C", 1);
        addQuestionToCategory3(q1);
        Question q2 = new Question("(C3) B is correct", "A", "B", "C", 2);
        addQuestionToCategory3(q2);
        Question q3 = new Question("(C3) C is correct", "A", "B", "C", 3);
        addQuestionToCategory3(q3);
        Question q4 = new Question("(C3) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory3(q4);
        Question q5 = new Question("(C3) B is correct again", "A", "B", "C", 2);
        addQuestionToCategory3(q5);
    }

    private void addQuestionToCategory1(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category1Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category1Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category1Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category1Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category1Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category1Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory2(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category2Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category2Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category2Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category2Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category2Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category2Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory3(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category3Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category3Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category3Table.TABLE_NAME, null, cv);
    }

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

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

        c.close();
        return questionList;
    }

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

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

        c.close();
        return questionList;
    }

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

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

        c.close();
        return questionList;
    }
}
deleted 4106 characters in body
Source Link

I want to show you the SQLiteOpenHelper and Contract class for a little quiz appEdit: I made for practicing purposeschanged my approach. I have 3 tables for 3 different I am trying to add categories to my existing SQLite quiz. TheThis is my approach works, but I wonder if I should remove redundancy. Aswhat do you can see, there is a lot of similar code for creating and filling those tables, but I feel likethink about it would be confusing if I would combine these methods into 1.

Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1?

What do Do you think the foreign key restriction is necessary?

Contract:

public final class QuizContract {

    private QuizContract() {
    }

    public static class Category1Table implements BaseColumns {
        public static final String TABLE_NAME = "category1_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category2Table implements BaseColumns {
        public static final String TABLE_NAME = "category2_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category3Table implements BaseColumns {
        public static final String TABLE_NAME = "category3_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }
}

SQLiteOpenHelper: I am a total SQLite noob and it's the first time I use a foreign key.

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

    private SQLiteDatabase db;

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

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

        final String SQL_CREATE_CAT1_TABLE = "CREATE TABLE " +
                Category1Table.TABLE_NAME + "public QuizDbHelper( " +
                Category1Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category1Table.COLUMN_QUESTION + " TEXT,Context "context) +{
                Category1Table.COLUMN_OPTION1 + " TEXTsuper(context, " +
                Category1Table.COLUMN_OPTION2 + " TEXTDATABASE_NAME, " +
                Category1Table.COLUMN_OPTION3 + " TEXTnull, " +
                Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
                "DATABASE_VERSION)";;
}

        final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +@Override
                Category2Table.TABLE_NAME +public "void onCreate( " +
                Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category2Table.COLUMN_QUESTION + " TEXT, " +
                Category2Table.COLUMN_OPTION1 + " TEXT, " +
                Category2Table.COLUMN_OPTION2 + " TEXT, " +
                Category2Table.COLUMN_OPTION3 + " TEXT,SQLiteDatabase "db) +{
                Category2Tablethis.COLUMN_ANSWER_NR + " INTEGER" +
              db = ")";db;

        final String SQL_CREATE_CAT3_TABLESQL_CREATE_CATEGORIES_TABLE = "CREATE TABLE " +
                Category3TableCategoriesTable.TABLE_NAME + " ( " +
                Category3TableCategoriesTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category3Table.COLUMN_QUESTION + " TEXT, " +
                Category3Table.COLUMN_OPTION1 + " TEXT, " +
                Category3Table.COLUMN_OPTION2 + " TEXT, " +
                Category3TableCategoriesTable.COLUMN_OPTION3COLUMN_NAME + " TEXT, " +
                Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

    final String SQL_CREATE_QUESTIONS_TABLE = db"CREATE TABLE " +
            QuestionsTable.execSQLTABLE_NAME + " (SQL_CREATE_CAT1_TABLE); " +
        db    QuestionsTable.execSQL(SQL_CREATE_CAT2_TABLE);_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        db    QuestionsTable.execSQL(SQL_CREATE_CAT3_TABLE);COLUMN_QUESTION + " TEXT, " +
        fillCategory1Table();    QuestionsTable.COLUMN_OPTION1 + " TEXT, " +
        fillCategory2Table    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 " +
        fillCategory3Table    CategoriesTable.TABLE_NAME + "(" + QuestionsTable._ID + ");" +
    }        ")";

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + Category1Table.TABLE_NAMESQL_CREATE_CATEGORIES_TABLE);
        db.execSQL("DROP TABLE IF EXISTS " + Category2Table.TABLE_NAMESQL_CREATE_QUESTIONS_TABLE);
        db.execSQLfillCategoriesTable("DROP TABLE IF EXISTS " + Category3Table.TABLE_NAME);
        onCreatefillQuestionsTable(db);
    }

    private void fillCategory1Table() {@Override
        Question q1 =public newvoid Question("onUpgrade(C1) A is correct",SQLiteDatabase "A"db, "B",int "C"oldVersion, 1);
        addQuestionToCategory1(q1);
        Question q2 = newint Question("(C1newVersion) B is correct", "A", "B", "C", 2);{
        addQuestionToCategory1db.execSQL(q2);
        Question"DROP q3TABLE =IF newEXISTS Question("(C1) C is correct", "A", "B", "C",+ 3QuestionsTable.TABLE_NAME);
        addQuestionToCategory1onCreate(q3db);
    }

    private void fillCategory2Table() {
        Question q1 = new Question("(C2) A is correct", "A", "B", "C", 1);
        addQuestionToCategory2(q1);
        Question q2 = new Question("(C2) B is correct", "A", "B", "C", 2);
        addQuestionToCategory2(q2);@Override
        Question q3 =public newvoid Question("onConfigure(C2) C is correct", "A", "B", "C",SQLiteDatabase 3db);
        addQuestionToCategory2(q3);{
        Question q4 = new Question("super.onConfigure(C2) A is correct again", "A", "B", "C", 1db);
        addQuestionToCategory2db.setForeignKeyConstraintsEnabled(q4true);
    }

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

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

    private void addQuestionToCategory2fillCategoriesTable(Question question) {
        ContentValuesCategory cvc1 = new ContentValues();
        cv.putCategory(Category2Table.COLUMN_QUESTION,"Cat question.getQuestion()1");
        cv.put(Category2Table.COLUMN_OPTION1, question.getOption1addCategory()c1);
    Category c2 = new cv.putCategory(Category2Table.COLUMN_OPTION2,"Cat question.getOption2()2");
        cv.put(Category2Table.COLUMN_OPTION3, question.getOption3addCategory()c2);
    Category c3 = new cv.putCategory(Category2Table.COLUMN_ANSWER_NR,"Cat question.getAnswerNr()3");
        db.insertaddCategory(Category2Table.TABLE_NAME, null, cvc3);
    }

    private void addQuestionToCategory3addCategory(QuestionCategory questioncategory) {
        ContentValues cv = new ContentValues();
        cv.put(Category3Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category3TableCategoriesTable.COLUMN_ANSWER_NRCOLUMN_NAME, questioncategory.getAnswerNrgetName());
        db.insert(Category3TableCategoriesTable.TABLE_NAME, null, cv);
    }

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

       public ifList<Category> (c.moveToFirstgetAllCategories()) {
            do {
                QuestionArrayList<Category> questionallCategories = new Question();
                question.setQuestion(c.getString(c.getColumnIndex(Category1Table.COLUMN_QUESTION)));
                question.setOption1(c.getString(c.getColumnIndexArrayList<>(Category1Table.COLUMN_OPTION1)));
              db = question.setOption2(c.getString(c.getColumnIndexgetReadableDatabase(Category1Table.COLUMN_OPTION2)));
               Cursor question.setOption3(c.getString(c.getColumnIndex(Category1Table.COLUMN_OPTION3)));
               = question.setAnswerNr(c.getInt(cdb.getColumnIndexrawQuery(Category1Table.COLUMN_ANSWER_NR)));
           "SELECT * FROM " + questionListCategoriesTable.add(question);
            } whileTABLE_NAME, (c.moveToNext()null);
        }

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

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

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

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

    if (c.moveToFirst()) {
        returndo questionList;{
            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());
    }

    public ArrayList<Question> getAllCategory3Questions() {
        ArrayList<Question> questionList = new ArrayList<>c.close();
        db =return getReadableDatabase();questionList;
        Cursor c = db.rawQuery("SELECT * FROM " + Category3Table.TABLE_NAME, null);}

       public ifArrayList<Question> (c.moveToFirstgetQuestions()) {
           String dodifficulty) {
                QuestionArrayList<Question> questionquestionList = new Question();
                question.setQuestion(c.getString(c.getColumnIndex(Category3Table.COLUMN_QUESTION)));
                question.setOption1(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION1)));
                question.setOption2(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION2)));
                question.setOption3(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION3)));
                question.setAnswerNr(c.getInt(c.getColumnIndex(Category3Table.COLUMN_ANSWER_NR)));
                questionList.addArrayList<>(question);
            }db while= (c.moveToNextgetReadableDatabase());
        }

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

    if (c.moveToFirst()) {
    return questionList;   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;
}
}

I want to show you the SQLiteOpenHelper and Contract class for a little quiz app I made for practicing purposes. I have 3 tables for 3 different categories. The approach works, but I wonder if I should remove redundancy. As you can see, there is a lot of similar code for creating and filling those tables, but I feel like it would be confusing if I would combine these methods into 1.

Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1?

What do you think?

Contract:

public final class QuizContract {

    private QuizContract() {
    }

    public static class Category1Table implements BaseColumns {
        public static final String TABLE_NAME = "category1_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category2Table implements BaseColumns {
        public static final String TABLE_NAME = "category2_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category3Table implements BaseColumns {
        public static final String TABLE_NAME = "category3_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }
}

SQLiteOpenHelper:

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

    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_CAT1_TABLE = "CREATE TABLE " +
                Category1Table.TABLE_NAME + " ( " +
                Category1Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category1Table.COLUMN_QUESTION + " TEXT, " +
                Category1Table.COLUMN_OPTION1 + " TEXT, " +
                Category1Table.COLUMN_OPTION2 + " TEXT, " +
                Category1Table.COLUMN_OPTION3 + " TEXT, " +
                Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +
                Category2Table.TABLE_NAME + " ( " +
                Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category2Table.COLUMN_QUESTION + " TEXT, " +
                Category2Table.COLUMN_OPTION1 + " TEXT, " +
                Category2Table.COLUMN_OPTION2 + " TEXT, " +
                Category2Table.COLUMN_OPTION3 + " TEXT, " +
                Category2Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT3_TABLE = "CREATE TABLE " +
                Category3Table.TABLE_NAME + " ( " +
                Category3Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category3Table.COLUMN_QUESTION + " TEXT, " +
                Category3Table.COLUMN_OPTION1 + " TEXT, " +
                Category3Table.COLUMN_OPTION2 + " TEXT, " +
                Category3Table.COLUMN_OPTION3 + " TEXT, " +
                Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        db.execSQL(SQL_CREATE_CAT1_TABLE);
        db.execSQL(SQL_CREATE_CAT2_TABLE);
        db.execSQL(SQL_CREATE_CAT3_TABLE);
        fillCategory1Table();
        fillCategory2Table();
        fillCategory3Table();
    }

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

    private void fillCategory1Table() {
        Question q1 = new Question("(C1) A is correct", "A", "B", "C", 1);
        addQuestionToCategory1(q1);
        Question q2 = new Question("(C1) B is correct", "A", "B", "C", 2);
        addQuestionToCategory1(q2);
        Question q3 = new Question("(C1) C is correct", "A", "B", "C", 3);
        addQuestionToCategory1(q3);
    }

    private void fillCategory2Table() {
        Question q1 = new Question("(C2) A is correct", "A", "B", "C", 1);
        addQuestionToCategory2(q1);
        Question q2 = new Question("(C2) B is correct", "A", "B", "C", 2);
        addQuestionToCategory2(q2);
        Question q3 = new Question("(C2) C is correct", "A", "B", "C", 3);
        addQuestionToCategory2(q3);
        Question q4 = new Question("(C2) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory2(q4);
    }

    private void fillCategory3Table() {
        Question q1 = new Question("(C3) A is correct", "A", "B", "C", 1);
        addQuestionToCategory3(q1);
        Question q2 = new Question("(C3) B is correct", "A", "B", "C", 2);
        addQuestionToCategory3(q2);
        Question q3 = new Question("(C3) C is correct", "A", "B", "C", 3);
        addQuestionToCategory3(q3);
        Question q4 = new Question("(C3) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory3(q4);
        Question q5 = new Question("(C3) B is correct again", "A", "B", "C", 2);
        addQuestionToCategory3(q5);
    }

    private void addQuestionToCategory1(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category1Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category1Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category1Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category1Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category1Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category1Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory2(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category2Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category2Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category2Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category2Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category2Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category2Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory3(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category3Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category3Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category3Table.TABLE_NAME, null, cv);
    }

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

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

        c.close();
        return questionList;
    }

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

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

        c.close();
        return questionList;
    }

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

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

        c.close();
        return questionList;
    }
}

Edit: I changed my approach. I am trying to add categories to my existing SQLite quiz. This is my approach, what do you think about it? Do you think the foreign key restriction is necessary? I am a total SQLite noob and it's the first time I use a foreign key.

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;
}
}
added 756 characters in body
Source Link
ferada
  • 11.4k
  • 26
  • 66

I want to show you the SQLiteOpenHelperSQLiteOpenHelper and ContractContract class for a little quiz app I made for practicing purposes. I have 3 tables for 3 different categories. The approach works, but I wonder if I should remove redundancy. As you can see, there is a lot of similar code for creating and filling those tables, but I feel like it would be confusing if I would combine these methods into 1. Should

Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1? What

What do you think?

public final class QuizContract {

    private QuizContract() {
    }

    public static class Category1Table implements BaseColumns {
        public static final String TABLE_NAME = "category1_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category2Table implements BaseColumns {
        public static final String TABLE_NAME = "category2_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category3Table implements BaseColumns {
        public static final String TABLE_NAME = "category3_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }
}
public class QuizDbHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "MyAwesomeQuiz.db";
    private static final int DATABASE_VERSION = 3;

    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_CAT1_TABLE = "CREATE TABLE " +
                Category1Table.TABLE_NAME + " ( " +
                Category1Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category1Table.COLUMN_QUESTION + " TEXT, " +
                Category1Table.COLUMN_OPTION1 + " TEXT, " +
                Category1Table.COLUMN_OPTION2 + " TEXT, " +
                Category1Table.COLUMN_OPTION3 + " TEXT, " +
                Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +
                Category2Table.TABLE_NAME + " ( " +
                Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category2Table.COLUMN_QUESTION + " TEXT, " +
                Category2Table.COLUMN_OPTION1 + " TEXT, " +
                Category2Table.COLUMN_OPTION2 + " TEXT, " +
                Category2Table.COLUMN_OPTION3 + " TEXT, " +
                Category2Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT3_TABLE = "CREATE TABLE " +
                Category3Table.TABLE_NAME + " ( " +
                Category3Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category3Table.COLUMN_QUESTION + " TEXT, " +
                Category3Table.COLUMN_OPTION1 + " TEXT, " +
                Category3Table.COLUMN_OPTION2 + " TEXT, " +
                Category3Table.COLUMN_OPTION3 + " TEXT, " +
                Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        db.execSQL(SQL_CREATE_CAT1_TABLE);
        db.execSQL(SQL_CREATE_CAT2_TABLE);
        db.execSQL(SQL_CREATE_CAT3_TABLE);
        fillCategory1Table();
        fillCategory2Table();
        fillCategory3Table();
    }

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

    private void fillCategory1Table() {
        Question q1 = new Question("(C1) A is correct", "A", "B", "C", 1);
        addQuestionToCategory1(q1);
        Question q2 = new Question("(C1) B is correct", "A", "B", "C", 2);
        addQuestionToCategory1(q2);
        Question q3 = new Question("(C1) C is correct", "A", "B", "C", 3);
        addQuestionToCategory1(q3);
    }

    private void fillCategory2Table() {
        Question q1 = new Question("(C2) A is correct", "A", "B", "C", 1);
        addQuestionToCategory2(q1);
        Question q2 = new Question("(C2) B is correct", "A", "B", "C", 2);
        addQuestionToCategory2(q2);
        Question q3 = new Question("(C2) C is correct", "A", "B", "C", 3);
        addQuestionToCategory2(q3);
        Question q4 = new Question("(C2) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory2(q4);
    }

    private void fillCategory3Table() {
        Question q1 = new Question("(C3) A is correct", "A", "B", "C", 1);
        addQuestionToCategory3(q1);
        Question q2 = new Question("(C3) B is correct", "A", "B", "C", 2);
        addQuestionToCategory3(q2);
        Question q3 = new Question("(C3) C is correct", "A", "B", "C", 3);
        addQuestionToCategory3(q3);
        Question q4 = new Question("(C3) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory3(q4);
        Question q5 = new Question("(C3) B is correct again", "A", "B", "C", 2);
        addQuestionToCategory3(q5);
    }

    private void addQuestionToCategory1(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category1Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category1Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category1Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category1Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category1Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category1Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory2(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category2Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category2Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category2Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category2Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category2Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category2Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory3(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category3Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category3Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category3Table.TABLE_NAME, null, cv);
    }

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

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

        c.close();
        return questionList;
    }

    c.closepublic ArrayList<Question> getAllCategory2Questions() {
        ArrayList<Question> questionList = new ArrayList<>();
    return questionList;   db = getReadableDatabase();
}        Cursor c = db.rawQuery("SELECT * FROM " + Category2Table.TABLE_NAME, null);

public ArrayList<Question> getAllCategory2Questions      if (c.moveToFirst()) {
    ArrayList<Question> questionList       do {
                Question question = new ArrayList<>Question();
    db = getReadableDatabase          question.setQuestion(c.getString(c.getColumnIndex(Category2Table.COLUMN_QUESTION)));
    Cursor            question.setOption1(c.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION1)));
 = db              question.rawQuerysetOption2("SELECTc.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION2)));
 * FROM " +            question.setOption3(c.getString(c.getColumnIndex(Category2Table.TABLE_NAME,COLUMN_OPTION3)));
 null               question.setAnswerNr(c.getInt(c.getColumnIndex(Category2Table.COLUMN_ANSWER_NR)));
                questionList.add(question);
            } while (c.moveToNext());
        }

    if (c.moveToFirst()) {
        do {
            Question question = new Question();
            question.setQuestion(c.getString(c.getColumnIndex(Category2Table.COLUMN_QUESTION)));
            question.setOption1(c.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION1)));
            question.setOption2(c.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION2)));
            question.setOption3(c.getString(c.getColumnIndex(Category2Table.COLUMN_OPTION3)));
            question.setAnswerNr(c.getInt(c.getColumnIndex(Category2Table.COLUMN_ANSWER_NR)));
            questionList.addclose(question);
        } whilereturn (c.moveToNext());questionList;
    }

    c.closepublic ArrayList<Question> getAllCategory3Questions() {
        ArrayList<Question> questionList = new ArrayList<>();
    return questionList;   db = getReadableDatabase();
}        Cursor c = db.rawQuery("SELECT * FROM " + Category3Table.TABLE_NAME, null);

public ArrayList<Question> getAllCategory3Questions      if (c.moveToFirst()) {
    ArrayList<Question> questionList       do {
                Question question = new ArrayList<>Question();
    db = getReadableDatabase          question.setQuestion(c.getString(c.getColumnIndex(Category3Table.COLUMN_QUESTION)));
    Cursor            question.setOption1(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION1)));
 = db              question.rawQuerysetOption2("SELECTc.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION2)));
 * FROM " +            question.setOption3(c.getString(c.getColumnIndex(Category3Table.TABLE_NAME,COLUMN_OPTION3)));
 null               question.setAnswerNr(c.getInt(c.getColumnIndex(Category3Table.COLUMN_ANSWER_NR)));
                questionList.add(question);
            } while (c.moveToNext());
        }

    if (c.moveToFirst()) {
        do {
            Question question = new Question();
            question.setQuestion(c.getString(c.getColumnIndex(Category3Table.COLUMN_QUESTION)));
            question.setOption1(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION1)));
            question.setOption2(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION2)));
            question.setOption3(c.getString(c.getColumnIndex(Category3Table.COLUMN_OPTION3)));
            question.setAnswerNr(c.getInt(c.getColumnIndex(Category3Table.COLUMN_ANSWER_NR)));
            questionList.addclose(question);
        } whilereturn (c.moveToNext());questionList;
    }

    c.close();
    return questionList;
}
}

I want to show you the SQLiteOpenHelper and Contract class for a little quiz app I made for practicing purposes. I have 3 tables for 3 different categories. The approach works, but I wonder if I should remove redundancy. As you can see, there is a lot of similar code for creating and filling those tables, but I feel like it would be confusing if I would combine these methods into 1. Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1? What do you think?

public final class QuizContract {

private QuizContract() {
}

public static class Category1Table implements BaseColumns {
    public static final String TABLE_NAME = "category1_questions";
    public static final String COLUMN_QUESTION = "question";
    public static final String COLUMN_OPTION1 = "option1";
    public static final String COLUMN_OPTION2 = "option2";
    public static final String COLUMN_OPTION3 = "option3";
    public static final String COLUMN_ANSWER_NR = "answer_nr";
}

public static class Category2Table implements BaseColumns {
    public static final String TABLE_NAME = "category2_questions";
    public static final String COLUMN_QUESTION = "question";
    public static final String COLUMN_OPTION1 = "option1";
    public static final String COLUMN_OPTION2 = "option2";
    public static final String COLUMN_OPTION3 = "option3";
    public static final String COLUMN_ANSWER_NR = "answer_nr";
}

public static class Category3Table implements BaseColumns {
    public static final String TABLE_NAME = "category3_questions";
    public static final String COLUMN_QUESTION = "question";
    public static final String COLUMN_OPTION1 = "option1";
    public static final String COLUMN_OPTION2 = "option2";
    public static final String COLUMN_OPTION3 = "option3";
    public static final String COLUMN_ANSWER_NR = "answer_nr";
}
}
public class QuizDbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyAwesomeQuiz.db";
private static final int DATABASE_VERSION = 3;

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_CAT1_TABLE = "CREATE TABLE " +
            Category1Table.TABLE_NAME + " ( " +
            Category1Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            Category1Table.COLUMN_QUESTION + " TEXT, " +
            Category1Table.COLUMN_OPTION1 + " TEXT, " +
            Category1Table.COLUMN_OPTION2 + " TEXT, " +
            Category1Table.COLUMN_OPTION3 + " TEXT, " +
            Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
            ")";

    final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +
            Category2Table.TABLE_NAME + " ( " +
            Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            Category2Table.COLUMN_QUESTION + " TEXT, " +
            Category2Table.COLUMN_OPTION1 + " TEXT, " +
            Category2Table.COLUMN_OPTION2 + " TEXT, " +
            Category2Table.COLUMN_OPTION3 + " TEXT, " +
            Category2Table.COLUMN_ANSWER_NR + " INTEGER" +
            ")";

    final String SQL_CREATE_CAT3_TABLE = "CREATE TABLE " +
            Category3Table.TABLE_NAME + " ( " +
            Category3Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            Category3Table.COLUMN_QUESTION + " TEXT, " +
            Category3Table.COLUMN_OPTION1 + " TEXT, " +
            Category3Table.COLUMN_OPTION2 + " TEXT, " +
            Category3Table.COLUMN_OPTION3 + " TEXT, " +
            Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
            ")";

    db.execSQL(SQL_CREATE_CAT1_TABLE);
    db.execSQL(SQL_CREATE_CAT2_TABLE);
    db.execSQL(SQL_CREATE_CAT3_TABLE);
    fillCategory1Table();
    fillCategory2Table();
    fillCategory3Table();
}

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

private void fillCategory1Table() {
    Question q1 = new Question("(C1) A is correct", "A", "B", "C", 1);
    addQuestionToCategory1(q1);
    Question q2 = new Question("(C1) B is correct", "A", "B", "C", 2);
    addQuestionToCategory1(q2);
    Question q3 = new Question("(C1) C is correct", "A", "B", "C", 3);
    addQuestionToCategory1(q3);
}

private void fillCategory2Table() {
    Question q1 = new Question("(C2) A is correct", "A", "B", "C", 1);
    addQuestionToCategory2(q1);
    Question q2 = new Question("(C2) B is correct", "A", "B", "C", 2);
    addQuestionToCategory2(q2);
    Question q3 = new Question("(C2) C is correct", "A", "B", "C", 3);
    addQuestionToCategory2(q3);
    Question q4 = new Question("(C2) A is correct again", "A", "B", "C", 1);
    addQuestionToCategory2(q4);
}

private void fillCategory3Table() {
    Question q1 = new Question("(C3) A is correct", "A", "B", "C", 1);
    addQuestionToCategory3(q1);
    Question q2 = new Question("(C3) B is correct", "A", "B", "C", 2);
    addQuestionToCategory3(q2);
    Question q3 = new Question("(C3) C is correct", "A", "B", "C", 3);
    addQuestionToCategory3(q3);
    Question q4 = new Question("(C3) A is correct again", "A", "B", "C", 1);
    addQuestionToCategory3(q4);
    Question q5 = new Question("(C3) B is correct again", "A", "B", "C", 2);
    addQuestionToCategory3(q5);
}

private void addQuestionToCategory1(Question question) {
    ContentValues cv = new ContentValues();
    cv.put(Category1Table.COLUMN_QUESTION, question.getQuestion());
    cv.put(Category1Table.COLUMN_OPTION1, question.getOption1());
    cv.put(Category1Table.COLUMN_OPTION2, question.getOption2());
    cv.put(Category1Table.COLUMN_OPTION3, question.getOption3());
    cv.put(Category1Table.COLUMN_ANSWER_NR, question.getAnswerNr());
    db.insert(Category1Table.TABLE_NAME, null, cv);
}

private void addQuestionToCategory2(Question question) {
    ContentValues cv = new ContentValues();
    cv.put(Category2Table.COLUMN_QUESTION, question.getQuestion());
    cv.put(Category2Table.COLUMN_OPTION1, question.getOption1());
    cv.put(Category2Table.COLUMN_OPTION2, question.getOption2());
    cv.put(Category2Table.COLUMN_OPTION3, question.getOption3());
    cv.put(Category2Table.COLUMN_ANSWER_NR, question.getAnswerNr());
    db.insert(Category2Table.TABLE_NAME, null, cv);
}

private void addQuestionToCategory3(Question question) {
    ContentValues cv = new ContentValues();
    cv.put(Category3Table.COLUMN_QUESTION, question.getQuestion());
    cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
    cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
    cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
    cv.put(Category3Table.COLUMN_ANSWER_NR, question.getAnswerNr());
    db.insert(Category3Table.TABLE_NAME, null, cv);
}

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

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

    c.close();
    return questionList;
}

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

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

    c.close();
    return questionList;
}

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

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

    c.close();
    return questionList;
}
}

I want to show you the SQLiteOpenHelper and Contract class for a little quiz app I made for practicing purposes. I have 3 tables for 3 different categories. The approach works, but I wonder if I should remove redundancy. As you can see, there is a lot of similar code for creating and filling those tables, but I feel like it would be confusing if I would combine these methods into 1.

Should I keep creating and querying the tables like this, or should I pass the table name as an argument to the method and then combine 3 similar methods to 1?

What do you think?

public final class QuizContract {

    private QuizContract() {
    }

    public static class Category1Table implements BaseColumns {
        public static final String TABLE_NAME = "category1_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category2Table implements BaseColumns {
        public static final String TABLE_NAME = "category2_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }

    public static class Category3Table implements BaseColumns {
        public static final String TABLE_NAME = "category3_questions";
        public static final String COLUMN_QUESTION = "question";
        public static final String COLUMN_OPTION1 = "option1";
        public static final String COLUMN_OPTION2 = "option2";
        public static final String COLUMN_OPTION3 = "option3";
        public static final String COLUMN_ANSWER_NR = "answer_nr";
    }
}
public class QuizDbHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "MyAwesomeQuiz.db";
    private static final int DATABASE_VERSION = 3;

    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_CAT1_TABLE = "CREATE TABLE " +
                Category1Table.TABLE_NAME + " ( " +
                Category1Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category1Table.COLUMN_QUESTION + " TEXT, " +
                Category1Table.COLUMN_OPTION1 + " TEXT, " +
                Category1Table.COLUMN_OPTION2 + " TEXT, " +
                Category1Table.COLUMN_OPTION3 + " TEXT, " +
                Category1Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT2_TABLE = "CREATE TABLE " +
                Category2Table.TABLE_NAME + " ( " +
                Category2Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category2Table.COLUMN_QUESTION + " TEXT, " +
                Category2Table.COLUMN_OPTION1 + " TEXT, " +
                Category2Table.COLUMN_OPTION2 + " TEXT, " +
                Category2Table.COLUMN_OPTION3 + " TEXT, " +
                Category2Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        final String SQL_CREATE_CAT3_TABLE = "CREATE TABLE " +
                Category3Table.TABLE_NAME + " ( " +
                Category3Table._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                Category3Table.COLUMN_QUESTION + " TEXT, " +
                Category3Table.COLUMN_OPTION1 + " TEXT, " +
                Category3Table.COLUMN_OPTION2 + " TEXT, " +
                Category3Table.COLUMN_OPTION3 + " TEXT, " +
                Category3Table.COLUMN_ANSWER_NR + " INTEGER" +
                ")";

        db.execSQL(SQL_CREATE_CAT1_TABLE);
        db.execSQL(SQL_CREATE_CAT2_TABLE);
        db.execSQL(SQL_CREATE_CAT3_TABLE);
        fillCategory1Table();
        fillCategory2Table();
        fillCategory3Table();
    }

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

    private void fillCategory1Table() {
        Question q1 = new Question("(C1) A is correct", "A", "B", "C", 1);
        addQuestionToCategory1(q1);
        Question q2 = new Question("(C1) B is correct", "A", "B", "C", 2);
        addQuestionToCategory1(q2);
        Question q3 = new Question("(C1) C is correct", "A", "B", "C", 3);
        addQuestionToCategory1(q3);
    }

    private void fillCategory2Table() {
        Question q1 = new Question("(C2) A is correct", "A", "B", "C", 1);
        addQuestionToCategory2(q1);
        Question q2 = new Question("(C2) B is correct", "A", "B", "C", 2);
        addQuestionToCategory2(q2);
        Question q3 = new Question("(C2) C is correct", "A", "B", "C", 3);
        addQuestionToCategory2(q3);
        Question q4 = new Question("(C2) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory2(q4);
    }

    private void fillCategory3Table() {
        Question q1 = new Question("(C3) A is correct", "A", "B", "C", 1);
        addQuestionToCategory3(q1);
        Question q2 = new Question("(C3) B is correct", "A", "B", "C", 2);
        addQuestionToCategory3(q2);
        Question q3 = new Question("(C3) C is correct", "A", "B", "C", 3);
        addQuestionToCategory3(q3);
        Question q4 = new Question("(C3) A is correct again", "A", "B", "C", 1);
        addQuestionToCategory3(q4);
        Question q5 = new Question("(C3) B is correct again", "A", "B", "C", 2);
        addQuestionToCategory3(q5);
    }

    private void addQuestionToCategory1(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category1Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category1Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category1Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category1Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category1Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category1Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory2(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category2Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category2Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category2Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category2Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category2Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category2Table.TABLE_NAME, null, cv);
    }

    private void addQuestionToCategory3(Question question) {
        ContentValues cv = new ContentValues();
        cv.put(Category3Table.COLUMN_QUESTION, question.getQuestion());
        cv.put(Category3Table.COLUMN_OPTION1, question.getOption1());
        cv.put(Category3Table.COLUMN_OPTION2, question.getOption2());
        cv.put(Category3Table.COLUMN_OPTION3, question.getOption3());
        cv.put(Category3Table.COLUMN_ANSWER_NR, question.getAnswerNr());
        db.insert(Category3Table.TABLE_NAME, null, cv);
    }

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

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

        c.close();
        return questionList;
    }

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

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

        c.close();
        return questionList;
    }

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

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

        c.close();
        return questionList;
    }
}
Source Link
Loading