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

如何将AlertDialog输入框数据存入数据库?Android开发求助

如何将EditText文本存入Android数据库(针对你的代码)

嘿,作为Android编程新手,你其实已经走在正确的路上啦!让我帮你梳理下现有逻辑的正确性,再补充几个关键细节让代码更健壮。

你的核心逻辑已经正确实现!

你在AlertDialog的确认按钮点击事件里,已经通过edt_nominal.getText().toString()获取了输入框的文本,并且把它作为第三个参数传给了Transaksi的构造函数——而Transaksi的构造函数正好会把这个值赋值给Nominal_Donasi成员变量,这部分完全没问题!

不过作为新手,还有几个容易忽略的点需要注意:

1. 增加输入验证,避免无效数据

用户可能输入空内容或者非数字的金额,这会导致数据库存入无效数据。你可以在执行数据库操作前先做检查:

alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String nominalStr = edt_nominal.getText().toString().trim();
        // 检查输入是否为空
        if (nominalStr.isEmpty()) {
            Toast.makeText(DonasiDetail.this, "请输入捐款金额", Toast.LENGTH_SHORT).show();
            return;
        }
        // 检查是否为有效数字(可选,适合金额场景)
        try {
            Double.parseDouble(nominalStr);
        } catch (NumberFormatException e) {
            Toast.makeText(DonasiDetail.this, "请输入有效的数字金额", Toast.LENGTH_SHORT).show();
            return;
        }
        // 验证通过后再执行数据库操作
        new Database(getBaseContext()).addToDonasi(new Transaksi(
            donasiId, currentDonasi.getNama(), nominalStr
        ));
        Toast.makeText(DonasiDetail.this, "Data Telah Masuk ke Donasi", Toast.LENGTH_SHORT).show();
        finish();
    }
});

2. 数据库操作必须放在子线程

直接在主线程执行数据库操作会导致ANR(应用无响应),这是Android开发的大忌。你可以用AsyncTask封装数据库操作(Java中常用方案):

// 定义异步任务类
private class AddDonasiTask extends AsyncTask<Transaksi, Void, Boolean> {
    private Context context;

    public AddDonasiTask(Context context) {
        this.context = context;
    }

    @Override
    protected Boolean doInBackground(Transaksi... transaksis) {
        // 在子线程执行耗时的数据库操作
        Database db = new Database(context);
        boolean isSuccess = db.addToDonasi(transaksis[0]);
        db.close();
        return isSuccess;
        // 建议修改addToDonasi方法,返回boolean表示操作是否成功
    }

    @Override
    protected void onPostExecute(Boolean success) {
        // 在主线程更新UI(比如显示结果Toast)
        if (success) {
            Toast.makeText(DonasiDetail.this, "Data Telah Masuk ke Donasi", Toast.LENGTH_SHORT).show();
            finish();
        } else {
            Toast.makeText(DonasiDetail.this, "存入数据失败,请重试", Toast.LENGTH_SHORT).show();
        }
    }
}

然后替换原来的数据库调用:

// 验证通过后执行异步任务
new AddDonasiTask(getBaseContext()).execute(new Transaksi(
    donasiId, currentDonasi.getNama(), nominalStr
));

3. 确认Database类的addToDonasi方法正确处理Nominal_Donasi

确保你的Database类中,addToDonasi方法正确读取Transaksi的Nominal_Donasi并插入数据库,示例如下:

public boolean addToDonasi(Transaksi transaksi) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("id_donasi", transaksi.getId_Donasi());
    values.put("nama_donasi", transaksi.getNama_Donasi());
    values.put("nominal_donasi", transaksi.getNominal_Donasi()); // 这里要正确获取金额字段

    // 执行插入并返回结果
    long result = db.insert("donasi_table", null, values);
    db.close();
    return result != -1; // result为-1表示插入失败
}

总的来说,你核心的赋值逻辑已经完全正确,上面的补充是为了让代码更稳定、更符合Android开发规范。如果还有数据库表结构、初始化相关的问题,随时可以再细化提问哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:51:43