Android 如何在一个应用程序中处理SQLiteOpenHelper和RoomDatabase?

Android 如何在一个应用程序中处理SQLiteOpenHelper和RoomDatabase?,android,sql,migration,database-migration,android-room,Android,Sql,Migration,Database Migration,Android Room,我有巨大的数据库,是用SQLiteOpenHelper编写的。现在,我们开始为我们的项目提供空间。所以,我的问题是:如何应对移民问题 例如,我在MySQLiteOpenHelper中有版本号100。我正在尝试将一个表(数据库中还有许多其他表)迁移到Room 我在中创建了MIGRATION\u 100\u 101 MyDatabase:RoomDatabase(@Database(version=101)类。所以,我需要将MySQLiteOpenHelper中的版本增加到101,并确保在MySQL

我有巨大的数据库,是用SQLiteOpenHelper编写的。现在,我们开始为我们的项目提供空间。所以,我的问题是:如何应对移民问题

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

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


有没有其他方法可以将SQLiteOpenHelper和RoomDatabase都放在一个应用程序中?

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


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

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

  • 创建SQLiteOpenHelper对象,该对象将删除所有表(如果当前DB版本为X),并为版本X+1重新创建所有未迁移的表。我们需要调用
    getReadableDatabase/GetWriteableDatabase
    方法,以便创建表(方法onCreate/onUpgrade)。此SQLiteOpenHelper对象将是临时的
  • 使用
    fallbackToDestructiveMigration
    为版本X+2创建RoomDatabase对象。这将清除所有迁移的表并重新创建它们。此外,我们需要调用
    getReadableDatabase/GetWriteableDatabase
    进行创建。此RoomDatabase对象也是临时的
  • 所以,现在我们已经创建了DB:部分表(未迁移)将由SQLiteOpenHelper创建,另一部分由RoomDatabase创建
  • 为版本X+2创建RoomDatabase对象,而不使用
    回退到DestructiveMigration
    。我们将在应用程序中使用此对象
  • 为版本X+2创建SQLiteOpenHelper对象,该对象将只使用创建的DB(完全不需要从X+1迁移到X+2,因为表是在步骤2由Room创建的)。我们将在应用程序中使用该对象