You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何删除SQLite数据库信息?附Android数据表记录删除代码

如何在SQLite数据库中正确删除数据

嘿,我来帮你梳理下SQLite数据删除的正确姿势,先看看你现有的代码,再一步步优化:

你的现有代码分析

首先,你的excluir方法已经实现了通过CODIGO字段删除CLIENTE表数据的核心逻辑,这个方向是对的:

public void excluir (int codigo){ 
    String[] parametros = new String[1]; 
    parametros[0] = String.valueOf(codigo); 
    conexao.delete("CLIENTE", "CODIGO = ? ", parametros);
}

还有按钮触发的tirar方法,负责调用删除逻辑:

public void tirar (View view){ 
    int x = 1; 
    ClienteRepositorio clienteRepositorio = new ClienteRepositorio(conexao); 
    clienteRepositorio.excluir(x); 
    onResume(); 
}

优化与完善建议

你的代码已经能完成删除操作,但可以增加一些健壮性处理和用户反馈,让功能更完善:

1. 捕获删除结果,判断操作是否成功

SQLite的delete方法会返回被成功删除的行数,我们可以利用这个返回值来判断删除是否生效:

// 修改excluir方法,返回删除行数
public int excluir(int codigo) {
    String[] parametros = new String[]{String.valueOf(codigo)};
    // 返回被删除的行数,方便后续判断
    return conexao.delete("CLIENTE", "CODIGO = ? ", parametros);
}

2. 优化触发方法,增加反馈与数据刷新

在按钮触发的tirar方法里,根据返回值给用户提示,同时确保界面数据能正确刷新:

public void tirar(View view) {
    int codigoParaExcluir = 1; // 这里可以改成动态获取的数值,比如从输入框/列表项获取
    ClienteRepositorio clienteRepositorio = new ClienteRepositorio(conexao);
    int linhasExcluidas = clienteRepositorio.excluir(codigoParaExcluir);
    
    if (linhasExcluidas > 0) {
        // 删除成功,给用户提示
        Toast.makeText(this, "Registro excluído com sucesso!", Toast.LENGTH_SHORT).show();
        // 如果用列表展示数据,记得通知适配器更新(比如RecyclerView的adapter)
        // adapter.notifyDataSetChanged();
        onResume(); // 如果你在onResume里重新加载了数据,这步没问题
    } else {
        // 没找到对应记录,提示用户
        Toast.makeText(this, "Nenhum registro encontrado com esse código!", Toast.LENGTH_SHORT).show();
    }
}

3. 异步处理数据库操作,避免ANR

如果你的数据库操作是在主线程执行的,当数据量大时可能会导致界面卡顿甚至ANR(应用无响应),建议用异步方式执行,比如用AsyncTask(Java)示例:

// 用AsyncTask封装异步删除操作
private class ExcluirClienteTask extends AsyncTask<Integer, Void, Integer> {
    @Override
    protected Integer doInBackground(Integer... codigos) {
        ClienteRepositorio repositorio = new ClienteRepositorio(conexao);
        return repositorio.excluir(codigos[0]);
    }

    @Override
    protected void onPostExecute(Integer linhasExcluidas) {
        super.onPostExecute(linhasExcluidas);
        // 这里处理删除后的反馈和界面刷新
        if (linhasExcluidas > 0) {
            Toast.makeText(MainActivity.this, "Excluído com sucesso!", Toast.LENGTH_SHORT).show();
            onResume();
        } else {
            Toast.makeText(MainActivity.this, "Registro não encontrado!", Toast.LENGTH_SHORT).show();
        }
    }
}

// 调用异步任务
public void tirar(View view) {
    new ExcluirClienteTask().execute(1);
}

4. 批量删除的事务处理

如果需要批量删除多条记录,建议用事务来保证操作的原子性(要么全部成功,要么全部失败):

public int excluirVarios(int[] codigos) {
    int totalExcluido = 0;
    conexao.beginTransaction();
    try {
        for (int codigo : codigos) {
            String[] params = new String[]{String.valueOf(codigo)};
            totalExcluido += conexao.delete("CLIENTE", "CODIGO = ?", params);
        }
        conexao.setTransactionSuccessful(); // 标记事务成功
    } finally {
        conexao.endTransaction(); // 结束事务,不管成功失败都会执行
    }
    return totalExcluido;
}

总结

你现有的代码核心逻辑是正确的,只需要补充结果判断、用户反馈、异步处理这些细节,就能让删除操作更稳定、友好。

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

火山引擎 最新活动