You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:40:23