从greendao迁移到Android Room

时间:2018-07-20 09:43:48

标签: android sqlite android-room greendao

我有一个以greendao为ORM的现有Android应用程序。但是,为了将来,我更喜欢使用Android Room。

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

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?

1 个答案:

答案 0 :(得分:0)

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

实际上,这只是索引名称的问题。在迁移过程中,我不得不将所有表索引从前缀IDX_重命名为index _。

这里仅是我的一张桌子的例子(我当然对所有带有索引的桌子都做了):

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)");
    }
};