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

