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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:28