Android获取EditText值查数据库并在另一Activity的TextView显示问题排查
问题分析与修正方案
以下是代码中存在的关键问题及对应的修复代码:
1. 控件ID匹配错误
Dashboard中错误地将TextInputLayout的ID赋值给EditText变量,实际应该引用内部的TextInputEditText(ID为location_text和goToInput_text),同时缺少页面跳转和参数传递逻辑。
修改后的Dashboard.java
public class Dashboard extends AppCompatActivity { private EditText locationEt; private EditText destinationEt; private Button searchBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); // 修正控件ID引用 locationEt = findViewById(R.id.location_text); destinationEt = findViewById(R.id.goToInput_text); searchBtn = findViewById(R.id.search); searchBtn.setOnClickListener(v -> { String origin = locationEt.getText().toString().trim(); String dest = destinationEt.getText().toString().trim(); // 跳转到SearchResult并传递输入参数 Intent intent = new Intent(Dashboard.this, SearchResult.class); intent.putExtra("ORIGIN", origin); intent.putExtra("DESTINATION", dest); startActivity(intent); }); } }
2. DatabaseAccess单例冗余与SQL语法错误
- 构造方法和单例方法中的
Class参数无实际作用,需删除简化实现 getbus_number方法的SQL语句错误:将输入的地点值直接作为字段名拼接,导致语法错误,需改为使用表中实际字段名(假设出发地字段为origin,目的地字段为destination)- 未关闭Cursor存在内存泄漏风险,需确保Cursor使用后关闭
- 单例实例添加
volatile保证线程安全
修改后的DatabaseAccess.java
public class DatabaseAccess { private SQLiteOpenHelper openHelper; private SQLiteDatabase db; private static volatile DatabaseAccess instance; // 保证线程安全 // 私有构造方法,移除无用参数 private DatabaseAccess(Context context) { this.openHelper = new DatabaseOpenHelper(context); } // 简化单例获取方法 public static DatabaseAccess getInstance(Context context) { if (instance == null) { synchronized (DatabaseAccess.class) { if (instance == null) { instance = new DatabaseAccess(context.getApplicationContext()); } } } return instance; } public void open() { this.db = openHelper.getWritableDatabase(); } public void close() { if (db != null) { this.db.close(); } } public String getBusNumber(String origin, String destination) { StringBuffer buffer = new StringBuffer(); Cursor c = null; try { // 修正SQL语句,使用参数化查询避免注入风险 c = db.rawQuery("SELECT bus_number FROM abuja WHERE origin = ? AND destination = ?", new String[]{origin, destination}); while (c.moveToNext()) { String busNumber = c.getString(c.getColumnIndexOrThrow("bus_number")); buffer.append(busNumber).append(" "); // 多编号用空格分隔 } } finally { // 确保Cursor关闭 if (c != null) { c.close(); } } return buffer.toString().trim(); } }
3. SearchResult硬编码查询参数
SearchResult中硬编码传递无效参数给查询方法,需改为接收Dashboard传递的参数后再执行查询。
修改后的SearchResult.java
public class SearchResult extends AppCompatActivity { private TextView busNumberOutput; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_result); busNumberOutput = findViewById(R.id.busNumberOutput); // 接收页面传递的参数 String origin = getIntent().getStringExtra("ORIGIN"); String destination = getIntent().getStringExtra("DESTINATION"); if (origin != null && destination != null && !origin.isEmpty() && !destination.isEmpty()) { DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this); databaseAccess.open(); String busNumber = databaseAccess.getBusNumber(origin, destination); databaseAccess.close(); // 查询完成后关闭数据库 busNumberOutput.setText(busNumber.isEmpty() ? "未找到对应公交" : busNumber); } else { busNumberOutput.setText("请输入有效的出发地和目的地"); } } }
额外注意事项
- 确保数据库表
abuja中存在origin、destination、bus_number字段,字段名需与SQL语句中的名称完全一致 - 数据库文件需放置在
assets/databases/目录下(SQLiteAssetHelper要求的固定路径),否则会导致数据库加载失败 - 可添加输入合法性校验(如非空、格式判断),提升用户体验
内容的提问来源于stack exchange,提问作者Ifedolapo Ajayi
相关产品推荐
相关产品推荐

