只是有人写给我的一个我认为可能有用的解决方案:
背景
我只是想知道表是否被修改过,所以我想也许通过获取最后生成的 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,即使没有添加任何内容,以及当它被清空时?
因为我已经找到了答案,所以我将其发布,但如果您认为还有其他好的解决方案,请随时发布。