【问题标题】:How to handle SQLiteOpenHelper and RoomDatabase in one app?如何在一个应用程序中处理 SQLiteOpenHelper 和 RoomDatabase?
【发布时间】:2018-06-20 04:11:03
【问题描述】:

我有巨大的数据库,用 SQLiteOpenHelper 编写。现在我们开始在我们的项目中实现 Room。所以,我的问题是:如何解决迁移问题?

例如,我在 MySQLiteOpenHelper 中有版本号 100。我正在尝试将一张表(数据库中还有许多其他表)迁移到 Room。

我已经创建了 MIGRATION_100_101 MyDatabase : RoomDatabase (@Database(version = 101) 类。所以,我需要将 MySQLiteOpenHelper 中的版本增加到 101,并确保在 MySQLiteOpenHelper 之前调用带有迁移的 MyDatabase?

有没有其他方法可以在一个应用中同时拥有 SQLiteOpenHelper 和 RoomDatabase?

【问题讨论】:

    标签: android sql migration database-migration android-room


    【解决方案1】:

    AFAIK Room 自己管理一个单独的数据库,没有很好的方法来维护自定义 sqliteopenhelper 和房间数据库。我们所做的是将表的子集从旧的 sqlite 一次迁移到房间(基本上,无论出于何种原因需要将表连接在一起),并保留两个单独的数据库,直到所有表都被迁移。

    根据您的情况,一次性迁移所有内容可能会更轻松。

    【讨论】:

      【解决方案2】:

      唯一允许我们这样做的解决方案是下一个。让我们想象一下,当前的数据库版本是 X,我们正计划迁移到版本 X+1。

      1. 创建将删除所有表的 SQLiteOpenHelper 对象,如果当前 DB 版本是 X 并为版本 X+1 重新创建所有未迁移的表。我们需要调用getReadableDatabase/getWritableDatabase 方法,以便进行表创建(方法 onCreate/onUpgrade)。此 SQLiteOpenHelper 对象将是临时的。
      2. 使用fallbackToDestructiveMigration 为版本 X+2 创建 RoomDatabase 对象。这将清除所有迁移的表并重新创建它们。此外,我们需要调用getReadableDatabase/getWritableDatabase 进行创建。这个 RoomDatabase 对象也是临时的。
      3. 因此,此时我们已经创建了数据库:部分表(未迁移的)将由 SQLiteOpenHelper 创建,其他 - 由 RoomDatabase 创建。
      4. 为不带fallbackToDestructiveMigration 的版本 X+2 创建 RoomDatabase 对象。我们将在我们的应用程序中使用这个对象。
      5. 为版本 X+2 创建 SQLiteOpenHelper 对象,它将只使用创建的数据库(根本不需要从 X+1 迁移到 X+2,因为表是由 Room 在步骤 2 中创建的)。我们将在我们的应用程序中使用这个对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        相关资源
        最近更新 更多