代码之家  ›  专栏  ›  技术社区  ›  ThN

应用程序在尝试检索ID自动递增Android时失败

  •  0
  • ThN  · 技术社区  · 6 月前

    我试图根据自动递增的“id”整数获取sqlite数据库/表中最后添加或插入的记录,但我的应用程序一直崩溃。

    这是我的Kotlin代码。

    @SuppressLint("Range")
    fun getLast(): Int {
    val db = databaseHelper.readableDatabase
    
    val cursor = db.rawQuery("SELECT * FROM sensor WHERE MAX(id)",null)
    
    if (cursor.count>0) {
    cursor.movetofirst()
    return cursor.getInt(cursor.getColumnIndex("id"))  <---- FAILS and app crashes.
    }
    }
    

    指向违规like的箭头是我的应用程序失败的原因。

    然而,在其他函数中,我对不同的列都这样做,它完全没有问题,如下所示。

    // iterate through the cursor and add the data to the list
    while (cursor.moveToNext()) {
    val Sensor_name = cursor.getString(cursor.getColumnIndex("sensor_name"))  <----- This line works.
    val Sensor_reading = cursor.getString(cursor.getColumnIndex("sensor_reading"))   <----- This line works.
    list.add(Sensor(Sensor_name, Sensor_reading))
    }
    

    那么,如何在Kotlin中使用SQL从SQLite数据库/表中搜索和检索自动增量ID列呢?

    1 回复  |  直到 6 月前
        1
  •  2
  •   Ashish Rajvanshi    6 月前

    您的问题在于SQL查询。使用此固定方法:

    @SuppressLint("Range")
    fun getLast(): Int {
        val db = databaseHelper.readableDatabase
        val cursor = db.rawQuery("SELECT MAX(id) AS max_id FROM sensor", null)
        return if (cursor.moveToFirst()) {
            val id = cursor.getInt(cursor.getColumnIndex("max_id"))
            cursor.close()
            id
        } else {
            cursor.close()
            -1 // Default if no rows exist
        }
    }
    

    关键修复:

    1. 查询更正: 使用SELECT MAX(id)作为MAX_id FROM传感器。
    2. 访问别名: 获取max_id而不是id。
    3. 光标管理: 始终关闭光标以避免内存泄漏。

    对于新插入,您可以直接使用SQLite的insert()方法,该方法返回最后插入的ID:

    val rowId = db.insert("sensor", null, contentValues)