如何将硬编码数据替换为数据库数据?及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
相关产品推荐
相关产品推荐

