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

Android Studio中DatabaseHelper查询传参及跨Activity列表获取问题

解决你的Android DatabaseHelper查询参数问题

我来帮你搞定这两个问题,咱们一步步拆解:

1. 如何为查询添加额外参数?

最安全且规范的方式是使用参数化查询,别直接把参数拼接到SQL字符串里(这会有SQL注入风险,还容易因为格式问题出错)。具体做法是用?作为参数占位符,然后通过rawQuery方法的第二个参数传入实际的参数值数组。

2. 传递id_instrumen参数并获取对应数据列表

结合你的需求,我们需要修改getListPengecekan方法,让它能接收来自另一个Activity的id_instrumen参数,再用这个参数过滤查询结果。

修改后的DatabaseHelper方法

先完善你的查询方法,添加参数并优化SQL语句:

public List<Pengecekan> getListPengecekan(int idInstrumen) {
    List<Pengecekan> pengecekanList = new ArrayList<>();
    openDataBase();
    
    // 用JOIN替代旧的表拼接写法,逻辑更清晰;用?作为id_instrumen的占位符
    String sql = "SELECT A.id_pengecekan, A.pengecekan, A.normal, B.nama_alat " +
                 "FROM tb_pengecekan A " +
                 "JOIN tb_alat B ON A.id_alat = B.id_alat " +  // 补全你原代码里缺失的关联条件
                 "JOIN tb_instrumen C ON B.id_instrumen = C.id_instrumen " +
                 "WHERE C.id_instrumen = ?";
    
    // 把id_instrumen转成字符串数组传入,顺序要和SQL里的?完全对应
    Cursor cursor = myDataBase.rawQuery(sql, new String[]{String.valueOf(idInstrumen)});
    
    // 遍历Cursor,把数据封装到Pengecekan列表中
    if (cursor.moveToFirst()) {
        do {
            Pengecekan pengecekan = new Pengecekan();
            // 注意getColumnIndex的字段名要和查询语句里的一致
            pengecekan.setIdPengecekan(cursor.getInt(cursor.getColumnIndex("id_pengecekan")));
            pengecekan.setPengecekan(cursor.getString(cursor.getColumnIndex("pengecekan")));
            pengecekan.setNormal(cursor.getString(cursor.getColumnIndex("normal")));
            pengecekan.setNamaAlat(cursor.getString(cursor.getColumnIndex("nama_alat")));
            
            pengecekanList.add(pengecekan);
        } while (cursor.moveToNext());
    }
    
    // 务必关闭Cursor和数据库,避免资源泄漏
    cursor.close();
    closeDataBase();
    
    return pengecekanList;
}

在另一个Activity中传递参数

当用户点击ListView的项时,获取对应的id_instrumen,再调用上面的方法:

// 假设你的ListView已经初始化完成
yourListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 获取选中项的id_instrumen,这里假设你的列表项是Instrumen对象
        Instrumen selectedItem = (Instrumen) parent.getItemAtPosition(position);
        int targetId = selectedItem.getIdInstrumen();
        
        // 实例化DatabaseHelper并调用带参数的方法
        DatabaseHelper dbHelper = new DatabaseHelper(YourCurrentActivity.this);
        List<Pengecekan> resultList = dbHelper.getListPengecekan(targetId);
        
        // 接下来就可以用这个resultList做后续操作,比如绑定到RecyclerView或ListView显示
    }
});

几个关键注意点

  • 防SQL注入:参数化查询能有效避免恶意SQL注入,同时让代码更健壮。
  • 资源管理:用完Cursor和数据库后一定要关闭,否则会造成内存泄漏。
  • SQL规范:用JOIN语句替代传统的逗号分隔表的写法,让关联逻辑更清晰易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:37:41