多SQLite表场景下如何减少代码重复?
解决SQLite多表重复代码的方案
1. 抽离通用CRUD方法
核心思路是把重复的逻辑提取成接受表名参数的通用方法,替代原来每个表对应一个方法的写法:
通用添加问题方法
把原来的addQuestionToGame1、addQuestionToGame2等方法合并成一个:
private void addQuestionToTable(String tableName, Question question) { ContentValues contentValues = new ContentValues(); contentValues.put(QuestionsTable.COLUMN_QUESTION, question.getQuestion()); contentValues.put(QuestionsTable.COLUMN_ANSWER1, question.getAnswer1()); contentValues.put(QuestionsTable.COLUMN_ANSWER2, question.getAnswer2()); contentValues.put(QuestionsTable.COLUMN_ANSWER3, question.getAnswer3()); contentValues.put(QuestionsTable.COLUMN_ANSWER4, question.getAnswer4()); contentValues.put(QuestionsTable.COLUMN_CORRECT_ANSWER_ID, question.getCorrectAnswerID()); db.insert(tableName, null, contentValues); }
调用时直接传入对应表名即可:
// 给Game1添加问题 addQuestionToTable(QuestionsTable.TABLE_NAME1, question); // 给Game2添加问题 addQuestionToTable(QuestionsTable.TABLE_NAME2, question);
通用获取问题列表方法
先把Cursor转Question的逻辑单独抽成工具方法,避免重复编写赋值代码:
@SuppressLint("Range") private Question cursorToQuestion(Cursor c) { Question question = new Question(); question.setQuestion(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_QUESTION))); question.setAnswer1(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER1))); question.setAnswer2(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER2))); question.setAnswer3(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER3))); question.setAnswer4(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER4))); question.setCorrectAnswerID(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_CORRECT_ANSWER_ID))); return question; }
再写通用的列表查询方法:
@SuppressLint("Range") public ArrayList<Question> getAllQuestionsFromTable(String tableName) { ArrayList<Question> questionsArrayList = new ArrayList<>(); db = getReadableDatabase(); Cursor c = db.rawQuery("SELECT * FROM " + tableName, null); if (c.moveToFirst()) { do { questionsArrayList.add(cursorToQuestion(c)); } while (c.moveToNext()); } c.close(); return questionsArrayList; }
调用示例:
// 获取Game1的所有问题 ArrayList<Question> game1Questions = getAllQuestionsFromTable(QuestionsTable.TABLE_NAME1);
2. 用枚举统一管理表名(可选优化)
如果表名较多,为了避免硬编码拼写错误,可以用枚举来统一管理所有游戏表名:
public enum GameTable { GAME1(QuestionsTable.TABLE_NAME1), GAME2(QuestionsTable.TABLE_NAME2), GAME3(QuestionsTable.TABLE_NAME3), GAME4(QuestionsTable.TABLE_NAME4), GAME5(QuestionsTable.TABLE_NAME5); private final String tableName; GameTable(String tableName) { this.tableName = tableName; } public String getTableName() { return tableName; } }
调用时更直观,也能避免写错表名:
addQuestionToTable(GameTable.GAME1.getTableName(), question);
3. 进一步封装成DAO类(可选)
如果后续还有更多数据库操作,可以把所有Question相关的CRUD逻辑封装到一个QuestionDao类中,只需要传入表名就能完成操作,彻底消除重复代码,也让代码结构更清晰。
内容的提问来源于stack exchange,提问作者CallMeAdmiral
相关产品推荐
相关产品推荐

