使用 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 ,包括当表没有插入任何内容时? 的相关文章

  • 如何为ScrollView放置固定图像背景?

    我应该想要滚动视图滚动 而不是背景中的图像 将图像添加到滚动视图框架之前的视图层次结构的较高位置
  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • React Native 从 JavaScript 代码内部访问 strings.xml

    有没有办法访问当前值android app src main res values strings xml从 JavaScript 代码内部 我想为每个构建放置不同的端点 URL 但我什至无法检测到反应本机代码内的构建类型 而不必求助于 D
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐