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
相关产品推荐
相关产品推荐

