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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:38