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

时间:2018-01-10 21:57:21

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

我有一个巨大的数据库,用SQLiteOpenHelper编写。现在我们开始为我们的项目实施Room。所以,我的问题是:如何处理迁移问题?

例如,MySQLiteOpenHelper中的版本号为100。我正在尝试将一个表(以及DB中有许多其他表)迁移到Room。

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

还有其他方法可以在一个应用程序中同时使用SQLiteOpenHelper和RoomDatabase吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

唯一允许我们执行此操作的解决方案是下一个。假设当前数据库版本为X,并且我们计划迁移到X + 1版本。

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