使用 Room,如何获取最后插入的自动生成的 ID ,包括当表没有插入任何内容时?

2024-03-11

只是有人写给我的一个我认为可能有用的解决方案:

背景

我只是想知道表是否被修改过,所以我想也许通过获取最后生成的 ID 这可能是一种方法,而且因为我知道这个值应该保存在某个地方,所以应该可以得到它。

我的想法 :

使用 Room,获取最后插入的自动生成的 ID(即使没有插入任何内容),而无需修改表或创建任何其他表。

问题

我找不到办法,所以我请求这个here https://issuetracker.google.com/issues/149423761并询问here https://www.reddit.com/r/androiddev/comments/f1opq1/weekly_questions_thread_february_10_2020/fhegcdq/.

我发现了什么

StackOverflow 上有一些关于使用“last_insert_rowid”的答案,但我未能使用它。

这是房间数据库示例:

构建.gradle

repositories {
    maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
}

...

apply plugin: 'kotlin-android-extensions'

...

final def room_version = '2.1.0'
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

...

DBProvider.kt

object DBProvider {
    const val DB_NAME = "room.db"
    lateinit var DB: MainDatabase

    fun init(context: Context) {
        //        Log.d("AppLog", "DBProvider init")
        DB = Room.databaseBuilder(context.applicationContext, MainDatabase::class.java, DB_NAME)
            .addCallback(object : RoomDatabase.Callback() {
            }).build()
    }

    @Database(
        entities = [FavoriteSpeedDialDTO::class],
        version = DB_VERSION,
        exportSchema = false
    )
    abstract class MainDatabase : RoomDatabase() {
        abstract fun favoriteSpeedDialDao(): FavoriteSpeedDialDao
        abstract fun dao(): SpecialDao
    }

}

最喜欢的SpeedDialDao.kt

@Dao
abstract class FavoriteSpeedDialDao {
    @Query("SELECT * FROM favorite_speed_dial")
    abstract fun getFavoritesList(): MutableList<FavoriteSpeedDialDTO>

    @Insert
    abstract fun insert(item: FavoriteSpeedDialDTO): Long

    @Query("DELETE FROM favorite_speed_dial")
    abstract fun deleteAll(): Int

}

最喜欢的快速拨号DTO.kt

@Entity(tableName = "favorite_speed_dial")
@Parcelize
data class FavoriteSpeedDialDTO(@ColumnInfo(name = COL_ID) @PrimaryKey(autoGenerate = true) var id: Long,
                                @ColumnInfo(name = COL_ASSIGNED_PHONE_NUMBER) var phoneNumber: String) : Parcelable {
    companion object {
        const val COL_ID = BaseColumns._ID
        const val COL_ASSIGNED_PHONE_NUMBER = "assigned_phone_number"
    }
}

问题

使用 Room,如何获取表的最后生成的 ID,即使没有添加任何内容,以及当它被清空时?

因为我已经找到了答案,所以我将其发布,但如果您认为还有其他好的解决方案,请随时发布。


答案是:

SpecialDao.kt

@Suppress("AndroidUnresolvedRoomSqlReference")
@Dao
abstract class SpecialDao {
    @Query("SELECT seq FROM sqlite_sequence WHERE name = :tableName")
    abstract fun getSequenceNumber(tableName: String): Long?
}

展示其工作原理的示例:

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        DBProvider.init(this)
        AsyncTask.execute {
            val dao = DBProvider.DB.dao()
            var sequenceNumber = dao.getSequenceNumber("favorite_speed_dial")
            Log.d("AppLog", "id:$sequenceNumber")
            val favoriteSpeedDialDao = DBProvider.DB.favoriteSpeedDialDao()
            var favoritesList = favoriteSpeedDialDao.getFavoritesList()
            Log.d("AppLog", "favoritesList:${favoritesList}")
            Log.d("AppLog", "deleting all and inserting a new item...")
            favoriteSpeedDialDao.deleteAll()
            favoriteSpeedDialDao.insert(FavoriteSpeedDialDTO(0L, "123"))
            favoritesList = favoriteSpeedDialDao.getFavoritesList()
            Log.d("AppLog", "favoritesList:${favoritesList}")
            sequenceNumber = dao.getSequenceNumber("favorite_speed_dial")
            Log.d("AppLog", "id:$sequenceNumber")

        }
    }


    companion object {
        fun toString(collection: Collection<*>?): String {
            if (collection == null)
                return "null"
            val sb = StringBuilder("{")
            var isFirst = true
            for (`object` in collection) {
                if (!isFirst)
                    sb.append(',')
                else
                    isFirst = false
                sb.append(`object`)
            }
            sb.append('}')
            return sb.toString()
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Room,如何获取最后插入的自动生成的 ID ,包括当表没有插入任何内容时? 的相关文章

随机推荐