从 greendao 迁移到 Android 房间

Migrate from greendao to Android Room

我有一个现有的 Android 应用程序,将 greendao 作为 ORM。但是,为了将来,我更愿意使用 Android 房间。

我现在在 Android 房间重建我的数据库方案,我想重用现有的 greendao 管理的 SQLlite 数据库。在 Android 房间中对此现有数据库进行查询时,我收到以下错误消息:

Caused by: java.lang.IllegalStateException: Migration didn't properly handle py_habits(...Habit).

Expected:
TableInfo{name='habits', columns={start_time_usual=Column{name='start_time_usual', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, end_place_id=Column{name='end_place_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, end_time_usual=Column{name='end_time_usual', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, start_place_id=Column{name='start_place_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, duration_usual=Column{name='duration_usual', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[Index{name='index_py_habits_id', unique=false, columns=[id]}]}
Found:
TableInfo{name='habits', columns={start_time_usual=Column{name='start_time_usual', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, end_place_id=Column{name='end_place_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, end_time_usual=Column{name='end_time_usual', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, start_place_id=Column{name='start_place_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, duration_usual=Column{name='duration_usual', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[Index{name='IDX_py_habits_id', unique=false, columns=[id]}]}

实际上,我只能看到两个区别 - 列的顺序不同(start_place_id 和 id 按顺序更改)并且 greendao 为索引提供了不​​同的前缀(IDX 与索引)。

有没有办法迁移模式以便我可以使用 Android Room 而不是 greendao?

感谢 Rahul Kumar 在我的问题评论中的提示。

其实只是索引名称的问题。我不得不在迁移中将前缀 IDX_ 中的所有 table 索引重命名为 index_。

这只是我的一个 table 的例子(我当然对所有有索引的人都这样做了):

static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        // Rename indices because of switch from Greendao to Android Room
        database.execSQL("DROP INDEX IDX_habits_id");
        database.execSQL("CREATE INDEX index_habits_id ON habits(id)");
    }
};