【问题标题】:Android Room: Get present database version / check if is out-datedAndroid Room:获取当前数据库版本/检查是否过时
【发布时间】:2020-06-23 10:00:41
【问题描述】:

比如说,我的应用中有一个完善的房间数据库。

我计划对数据库进行升级。但是,升级/数据迁移是巨大的,因此我想告诉用户耐心等待,通过显示 UI 消息,例如 AlertDialogToast 等。

但我不知道如何检查是否需要播放消息----我的意思是,我如何获取/检查他们当前的数据库版本?有没有类似RoomDatabase.getVersion()RoomDatabase.isOlderVersion() / RoomDatabase.isOutDated() 的函数?

另一方面,我知道有Migration 类。考虑到我所知道的可以检查数据库版本,我打算这样做

  1. 在数据库中创建监听器持有者。
  2. 在 UI 线程构建数据库之前,在其中注册一个监听器。
  3. Migration被调用时,通知监听器做事。

但是,版本升级不是很复杂吗?有更好的主意吗?

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    首先我建议你在后台线程中隐藏所有迁移。如果应用程序生命周期中对数据库的首次访问将在后台执行,则无论如何都可能会这样做。

    其次,如果您有任何 UI 线程使用数据库,请尝试更改应用程序的逻辑,将对数据库的访问置于后台。

    如果您仍然需要检查当前运行的数据库的版本,您可以从这里获得它:

    database.openHelper.writableDatabase.version

    database.openHelper.readableDatabase.version

    数据库是您之前使用构建器创建的数据库实例。

    顺便说一句,你是如何创建实例的?

    我的问题可能是关于流程的自动化。

    至于我,我在 Dagger2 中创建了一个数据库实例。我有调用生成器的提供程序方法。我在那里添加迁移。另外,如果现有数据库的版本和新数据库的版本(更新后)不同,构建器会执行我提供的迁移。

    如果您手动执行所有这些操作,我希望您不要忘记任何事情。

    UPD:

    如果你想在不打开数据库的情况下知道版本,我会建议最简单的方法。将数据库版本存储在Shared Preference 中。在构建数据库实例之前获取它,并在开始迁移之前执行您想要执行的任何操作。

    【讨论】:

    • 应用程序在打开时构建一个数据库实例,并在完成后关闭它。我设计这样工作,因为我认为房间实例很昂贵,因此不应留在后台。我错了吗?如果是这样,我很高兴有一个在后台。
    • @SamuelT.Chou 最昂贵的是打开和关闭操作。在应用程序的生命周期内保持与数据库的活动连接,甚至在应用程序关闭后的短时间内(我的意思是通过更改任务进入后台) - 没关系。与数据库的连接就像一把锁,可以快速访问存储中的文件。它不会将整个文件保存在内存中或类似的东西中。
    • 我确实使用提供程序来处理构建和迁移。如果没有,我会有比这个更多的问题,哈哈
    • 所以,这里的主要问题是:如何在打开数据库之前检查数据库的版本?对吗?
    • Dao 只是访问数据库中数据的API。它不存储数据本身。最昂贵的是Action open。我不确定close 操作是否同样昂贵。但我想在关闭后你需要再次打开它:) 在Expensive 下我的意思是它很耗时。不是秒。但仍然。
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多