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

Android中获取SQLite自增ID时App崩溃,如何正确实现?

解决SQLite获取自增ID最后一条记录崩溃的问题

你的代码崩溃主要有两个核心问题:SQL语句语法错误,以及Cursor方法名拼写错误,下面逐一修正并给出正确实现:

问题分析

  1. SQL语句错误:你写的SELECT * FROM sensor WHERE MAX(id)语法无效。MAX(id)是聚合函数,不能直接作为WHERE子句的条件,这种写法无法返回正确的结果集。
  2. Cursor方法名错误:cursor.movetofirst()是拼写错误,Kotlin中正确的方法名是cursor.moveToFirst()(驼峰命名),调用不存在的方法会直接抛出异常导致崩溃。
  3. 未关闭Cursor:原代码没有关闭Cursor,属于不良实践,可能引发内存泄漏。

正确实现方案

方案1:直接获取最大自增ID(效率最高)

如果只需要最后插入记录的ID,不需要整条数据,直接查询最大ID即可:

@SuppressLint("Range")
fun getLastId(): Int {
    val db = databaseHelper.readableDatabase
    var lastId = 0
    // 用MAX(id)查询并别名,方便Cursor取值
    val cursor = db.rawQuery("SELECT MAX(id) AS max_id FROM sensor", null)
    // 正确调用moveToFirst()判断Cursor是否有数据
    if (cursor.moveToFirst()) {
        lastId = cursor.getInt(cursor.getColumnIndex("max_id"))
    }
    // 必须关闭Cursor释放资源
    cursor.close()
    return lastId
}

方案2:获取最后插入的整条记录

如果需要获取这条记录的完整数据,通过ORDER BY id DESC LIMIT 1排序后取第一条:

@SuppressLint("Range")
fun getLastSensor(): Sensor? {
    val db = databaseHelper.readableDatabase
    var sensor: Sensor? = null
    // 按id倒序排列,只取第一条(即最后插入的记录)
    val cursor = db.rawQuery("SELECT * FROM sensor ORDER BY id DESC LIMIT 1", null)
    if (cursor.moveToFirst()) {
        val id = cursor.getInt(cursor.getColumnIndex("id"))
        val sensorName = cursor.getString(cursor.getColumnIndex("sensor_name"))
        val sensorReading = cursor.getString(cursor.getColumnIndex("sensor_reading"))
        sensor = Sensor(id, sensorName, sensorReading) // 适配你的Sensor类构造函数
    }
    cursor.close()
    return sensor
}

为什么其他代码能正常工作?

你提供的遍历Cursor代码中使用的是moveToNext(),方法名是正确的驼峰写法,而且SQL语句是有效的查询,所以能正常执行。而崩溃代码中不仅SQL写错,还把moveToFirst()拼成了movetofirst(),这是直接导致崩溃的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:03:18