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



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

背景

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

我的想法 :

使用 Room,获取上次插入的自动生成的 ID(即使从未插入任何内容(,而无需修改表或创建任何其他表。

问题所在

我找不到办法,所以我在这里要求这个并在这里问。

我发现了什么

StackOverflow有一些关于使用"last_insert_rowid"的答案,但我没有使用它。

下面是一个示例房间数据库:

build.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
}
}

收藏夹快速拨号道.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
}

FavoriteSpeedDialDTO.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,即使没有添加任何内容,也从未清空过?

由于我已经找到了答案,所以我发布了它,但如果您认为还有另一个不错的解决方案,请随时发布它。

答案是:

特别道网

@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()
}
}
}

最新更新