【发布时间】:2018-07-20 09:43:47
【问题描述】:
我有一个以 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 与 index)。
有没有办法迁移架构,以便我可以使用 Android Room 而不是 greendao?
【问题讨论】:
-
我从来没有这样做过,但是 afaik 该列是按照它们在您的 @Entity 类中的声明顺序制作的。因此,也许切换声明可能会为您完成这项工作。
-
谢谢,我会尝试有关您提出的索引的示例代码...但对于您的第二点:在实体中,订单实际上是 id -> start_place_id... 在 greendao 和 Android Room 中。我希望这只是索引的问题...
标签: android sqlite android-room greendao