我有一个以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?
答案 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)");
}
};