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

如何在Android最新导航抽屉活动的Fragment中实现SQLite数据库CRUD操作?

在Android导航抽屉Fragment中实现SQLite插入操作(附优化方案)

我来帮你梳理下这段插入数据的代码,同时给你一些优化建议,让你的CRUD操作更规范可靠。

原代码的问题点

  • SQL语句中重复使用了DatabaseHelper.TABLE_NAME2_COL_3,会导致字段数量不匹配,大概率插入失败
  • 直接拼接字符串构造SQL语句存在SQL注入风险,而且当字段值包含引号、特殊字符时会直接报错
  • 没有关闭数据库连接,长期运行可能造成资源泄漏
  • 没有处理数据库操作可能出现的异常,一旦出错会导致APP崩溃

优化后的插入代码

// 1. 获取并整理输入值
String firstNameTxt = firstName.getText().toString().trim();
String lastNameTxt = lastName.getText().toString().trim();
String guardNameTxt = guardName.getText().toString().trim();
String guardNumberTxt = guardNumber.getText().toString().trim();
boolean morningValue = morning.isSelected(); // 简化原代码的三元运算,isSelected()本身返回boolean
boolean eveningValue = evening.isSelected();

// 2. 用try-with-resources自动管理数据库资源,避免泄漏
try (DatabaseHelper helper = new DatabaseHelper(getActivity());
     SQLiteDatabase db = helper.getWritableDatabase()) {

    // 使用ContentValues替代硬拼SQL,安全又易维护
    ContentValues values = new ContentValues();
    values.put(DatabaseHelper.TABLE_NAME2_COL_2, firstNameTxt);
    values.put(DatabaseHelper.TABLE_NAME2_COL_3, lastNameTxt);
    values.put(DatabaseHelper.TABLE_NAME2_COL_4, guardNameTxt); // 修正原代码重复的COL_3字段
    values.put(DatabaseHelper.TABLE_NAME2_COL_5, guardNumberTxt);
    values.put(DatabaseHelper.TABLE_NAME2_COL_6, morningValue ? 1 : 0); // SQLite无原生boolean,用1/0存储
    values.put(DatabaseHelper.TABLE_NAME2_COL_7, eveningValue ? 1 : 0);

    // 执行插入,返回插入行的ID(-1表示失败)
    long insertResult = db.insert(DatabaseHelper.TABLE_NAME2, null, values);

    // 根据结果给用户反馈
    if (insertResult != -1) {
        Toast.makeText(getActivity(), "数据保存成功", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getActivity(), "保存失败,请重试", Toast.LENGTH_SHORT).show();
    }
} catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(getActivity(), "保存出错:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}

关键优化说明

  • 使用ContentValues:Android官方推荐的安全插入方式,自动处理特殊字符,彻底避免SQL注入问题
  • 自动资源管理:try-with-resources语法会在代码块结束时自动关闭数据库连接,无需手动调用close()
  • 规范boolean存储:SQLite没有原生布尔类型,用整数1(代表true)和0(代表false)存储是行业通用做法
  • 结果校验:通过db.insert()的返回值判断插入是否成功,给用户更精准的反馈
  • 异常捕获:捕获数据库操作可能出现的异常,避免APP崩溃,同时输出错误信息便于调试

额外CRUD扩展建议

如果要实现完整的增删改查,建议在DatabaseHelper中封装专用方法,比如:

  • long insertGuardInfo(String firstName, String lastName, ...):封装插入逻辑
  • List<GuardInfo> getAllGuardInfo():查询所有数据
  • int updateGuardInfo(int id, String newName, ...):更新指定数据
  • int deleteGuardInfo(int id):删除指定数据

这样Fragment中的代码会更简洁,逻辑也更集中,后续维护和复用都更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:50:18