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

如何将硬编码数据替换为数据库数据?及I've Never游戏DBHelperList连接咨询

实现建议:从数据库加载数据到"I've Never"游戏

看起来你已经把游戏的基础交互(点击按钮切换文本)搞定了,现在只需要把硬编码的数据换成数据库来源就行,我分步骤给你讲清楚怎么实现:

第一步:确保你的DBHelperList配置正确

首先,DBHelperList得是一个标准的SQLiteOpenHelper子类,负责数据库的创建、升级,以及提供数据查询方法。这里给你一个完整的示例实现,你可以根据自己的需求调整表结构和方法:

public class DBHelperList extends SQLiteOpenHelper {
    // 数据库基本配置
    private static final String DATABASE_NAME = "NeverGame.db";
    private static final int DATABASE_VERSION = 1;
    // 游戏语句表的结构
    private static final String TABLE_STATEMENTS = "game_statements";
    private static final String COLUMN_ID = "_id";
    private static final String COLUMN_STATEMENT = "statement";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建存储语句的表
        String createTableSQL = "CREATE TABLE " + TABLE_STATEMENTS + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_STATEMENT + " TEXT NOT NULL)";
        db.execSQL(createTableSQL);

        // 可选:插入一些默认的游戏语句,方便测试
        insertDefaultStatement(db, "I've never stayed up all night.");
        insertDefaultStatement(db, "I've never ridden a bike.");
        insertDefaultStatement(db, "I've never tried skydiving.");
    }

    private void insertDefaultStatement(SQLiteDatabase db, String statement) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_STATEMENT, statement);
        db.insert(TABLE_STATEMENTS, null, values);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 简单的升级逻辑:删除旧表重建,实际项目可以根据版本做更复杂的迁移
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_STATEMENTS);
        onCreate(db);
    }

    // 获取所有游戏语句的方法
    public List<String> getAllStatements() {
        List<String> statements = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.query(TABLE_STATEMENTS,
                new String[]{COLUMN_STATEMENT},
                null, null, null, null, null);

        if (cursor.moveToFirst()) {
            do {
                String stmt = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_STATEMENT));
                statements.add(stmt);
            } while (cursor.moveToNext());
        }
        cursor.close();
        db.close();
        return statements;
    }

    // 可选:直接获取随机一条语句的方法(适合数据量很大的情况)
    public String getRandomStatement() {
        String stmt = "";
        SQLiteDatabase db = getReadableDatabase();
        // 用SQL的RANDOM()函数随机取一条
        Cursor cursor = db.rawQuery("SELECT " + COLUMN_STATEMENT + " FROM " + TABLE_STATEMENTS + " ORDER BY RANDOM() LIMIT 1", null);
        if (cursor.moveToFirst()) {
            stmt = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_STATEMENT));
        }
        cursor.close();
        db.close();
        return stmt;
    }
}

第二步:在NeverTheGame.java中连接数据库并替换硬编码逻辑

接下来,你需要在游戏页面初始化DBHelperList,从数据库获取数据,然后修改按钮点击的逻辑,用数据库的数据替换原来的硬编码文本:

public class NeverTheGame extends AppCompatActivity {
    private TextView statementTextView;
    private Button nextButton;
    private List<String> gameStatements;
    private Random random;
    private DBHelperList dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_never_the_game);

        // 初始化视图
        statementTextView = findViewById(R.id.statement_text_view);
        nextButton = findViewById(R.id.next_button);
        random = new Random();

        // 初始化数据库帮助类
        dbHelper = new DBHelperList(this);
        // 从数据库加载所有语句(如果数据量小,一次性加载更流畅)
        gameStatements = dbHelper.getAllStatements();

        // 初始显示一条语句
        if (!gameStatements.isEmpty()) {
            showRandomStatement();
        } else {
            statementTextView.setText("No game statements found!");
        }

        // 按钮点击切换文本的逻辑
        nextButton.setOnClickListener(v -> {
            if (!gameStatements.isEmpty()) {
                showRandomStatement();
            }
        });
    }

    // 随机显示一条语句(替换旧文本为新文本)
    private void showRandomStatement() {
        int randomIndex = random.nextInt(gameStatements.size());
        String newStatement = gameStatements.get(randomIndex);
        // 直接setText就会隐藏旧文本,显示新文本,符合你的需求
        statementTextView.setText(newStatement);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 记得关闭数据库连接,避免资源泄漏
        if (dbHelper != null) {
            dbHelper.close();
        }
    }
}

如果你的游戏语句特别多,不想一次性加载到内存,可以改用getRandomStatement()方法,修改点击逻辑如下:

nextButton.setOnClickListener(v -> {
    String randomStmt = dbHelper.getRandomStatement();
    if (!randomStmt.isEmpty()) {
        statementTextView.setText(randomStmt);
    } else {
        statementTextView.setText("No statements available!");
    }
});

一些额外的注意事项

  • 异常处理:实际开发中,建议给数据库操作加上try-catch块,捕获SQLiteException等异常,避免因为数据库问题导致应用崩溃。
  • 数据初始化:如果需要用户自定义添加语句,可以做一个简单的输入页面,调用DBHelperList的插入方法把用户输入的语句存到数据库里。
  • 性能优化:如果数据库数据量极大,建议使用异步任务(比如Coroutine)来执行数据库查询,避免阻塞主线程导致UI卡顿。

内容的提问来源于stack exchange,提问作者 Nickotitta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:12:51