Android Studio Kotlin:如何给SQLite数据库中所有注册用户发邮件
问题描述
点击「提交」按钮时,希望给SQLite数据库中所有注册用户发送邮件。目前思路是从数据库取出邮箱地址存入列表,但不确定如何转换成发送邮件所需的格式,且自己尝试的获取邮箱函数存在问题。已知点击事件处理逻辑,仅需解决邮箱获取及传递问题。
提供的现有代码:
数据库插入函数
fun insertEmail(email: String, firstName: String, lastName: String, company: String): Long { val values = ContentValues().apply { put(COLUMN_EMAIL, email) put(COLUMN_FIRSTNAME, firstName) put(COLUMN_LASTNAME, lastName) put(COLUMN_COMPANY, company) } val db = writableDatabase return db.insert(EMAIL_TABLE, null, values) }
发送邮件代码
val recipients = arrayListOf<String>("abc@something.net", "xyz@something.net") val subject = "Test" val message = "Test" val mIntent = Intent(Intent.ACTION_SEND) mIntent.data = Uri.parse("mailto:") mIntent.type = "text/plain" mIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(recipients)) mIntent.putExtra(Intent.EXTRA_SUBJECT, subject) mIntent.putExtra(Intent.EXTRA_TEXT, message) try { startActivity(Intent.createChooser(mIntent, "Send Email")) } catch (e: Exception){ Toast.makeText(this, e.message, Toast.LENGTH_SHORT).show() }
尝试的获取邮箱函数
fun getEmails() { val db = readableDatabase val select = "$COLUMN_EMAIL" val cursor = db.query(EMAIL_TABLE, null, select, null, null, null, null) val emails = arrayListOf<String>() with(cursor) { while(moveToNext()) { val email = getString(getColumnIndexOrThrow("email")) emails.add(email) } } cursor.close() }
解决方案
1. 修正获取邮箱的函数
原getEmails函数存在两个问题:一是未返回获取到的邮箱列表,二是query方法参数使用错误(第二个参数是要查询的列,第三个是WHERE条件,原代码把列名传到了WHERE条件位置)。修正后的函数如下:
fun getEmails(): List<String> { val emails = arrayListOf<String>() val db = readableDatabase // 指定仅查询邮箱列,提升查询效率 val projection = arrayOf(COLUMN_EMAIL) val cursor = db.query( EMAIL_TABLE, projection, // 要查询的列 null, // WHERE条件(无需过滤时传null) null, // WHERE条件的参数 null, null, null ) with(cursor) { while(moveToNext()) { // 使用常量COLUMN_EMAIL替代硬编码列名,避免拼写错误 val email = getString(getColumnIndexOrThrow(COLUMN_EMAIL)) emails.add(email) } } cursor.close() return emails }
2. 正确传递邮箱列表到邮件Intent
发送邮件的代码中,Intent.EXTRA_EMAIL需要接收String数组,而非包含ArrayList的数组。调用修正后的getEmails获取列表后,转成数组传入即可:
// 从数据库获取所有邮箱并转为数组 val recipients = dbHelper.getEmails().toTypedArray() val subject = "Test" val message = "Test" val mIntent = Intent(Intent.ACTION_SEND) mIntent.data = Uri.parse("mailto:") mIntent.type = "text/plain" // 直接传入String数组 mIntent.putExtra(Intent.EXTRA_EMAIL, recipients) mIntent.putExtra(Intent.EXTRA_SUBJECT, subject) mIntent.putExtra(Intent.EXTRA_TEXT, message) try { startActivity(Intent.createChooser(mIntent, "Send Email")) } catch (e: Exception){ Toast.makeText(this, e.message ?: "发送失败", Toast.LENGTH_SHORT).show() }
关键说明
query方法的projection参数用于指定要查询的列,仅查询所需的COLUMN_EMAIL可减少数据读取量,提升性能。- 使用常量
COLUMN_EMAIL替代硬编码列名,能避免因列名拼写错误导致的崩溃。 Intent.EXTRA_EMAIL接受String[]类型,因此需要将List转换为TypedArray。
内容的提问来源于stack exchange,提问作者Whitt
相关产品推荐
相关产品推荐

