【问题标题】:Migrate from greendao to Android Room从 greendao 迁移到 Android Room
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2021-06-04
    相关资源
    最近更新 更多