【问题标题】:Accessing old Room database in Room Migrations在 Room Migrations 中访问旧的 Room 数据库
【发布时间】:2021-09-27 02:34:46
【问题描述】:

我已经更新了我的数据库结构,并将包含在一个 DB(我们称之为 DB 1)中的数据移动到另一个 DB(我们称之为 DB 2)的表中。

如何在房间迁移中获取旧 DB (DB 1) 的实例,以将数据从 DB 1 移动到在 DB 2 中创建的新表?

谢谢大家。

【问题讨论】:

    标签: android android-room database-migration


    【解决方案1】:

    假设两个数据库都在设备上,您有两个选择:-

    您可以使用[openDatabase][1] 方法将其作为 SQLiteDatabase 打开,完成后显然将其关闭。

    • 此方法不允许通过 SQL 直接复制/移动,您将提取到游标中然后从游标加载。

    您也可以将旧的ATTACH 转移到新的,以确保您在移动数据后DETACH。请注意,在访问旧数据库(附加)时,使用 schema name 可能至关重要。

    • 这确实有助于使用 SQL 直接复制。
    • 请注意,DATABASE 是数据库的路径,并且应该用单引号括起来。例如main_sdb.execSQL("ATTACH DATABASE '" + other_sdb.getPath() + "' AS other"); main_sdb 是一个 SupportSQliteDatabase 实例(传递给迁移),在这种情况下,附加的数据库的路径是从另一个这样的实例中检索的。架构名称是other

    【讨论】:

    • 谢谢,这就是我想要的。但我有个问题! Room 没有运行迁移,因为我认为这只是一个新数据库。如何强制它运行迁移?我能想到的唯一其他解决方案是在 MainActivity 的 onCreate() 中手动执行,但这对我来说感觉不对!
    • @LorenzoBenevento 您可以通过增加数据库版本号来强制迁移。您还可以使用 onCreate 或 onOpen 回调。前者仅在首次创建数据库时运行。后者将在每次打开数据库时运行,并且需要检查状态,例如新表中有没有行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多