当前位置: 首页 > 知识库问答 >
问题:

从绿道迁移到Android Room

南宫星波
2023-03-14

我现在在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 vs.index)。

有没有一种方法可以迁移模式,这样我就可以使用Android Room而不是Greendao了?

共有1个答案

雍俊远
2023-03-14

感谢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)");
    }
};
 类似资料:
  • 问题内容: 我们的Oracle数据库遇到了严重的性能问题,我们想尝试将其迁移到基于MySQL的数据库(直接使用MySQL,或者最好是Infobright)。 问题是,在我们实际上不知道新数据库的所有功能是否符合我们的需求之前,我们需要让旧系统和新系统至少重叠数周(如果不是几个月)。 因此,这是我们的情况: Oracle数据库由多个表组成,每百万行。白天,实际上有成千上万的语句,我们无法停止迁移。

  • 问题内容: 在我的应用程序中,我从UIWebView迁移到WKWebView,如何为WKWebView重写这些功能? 和 问题答案: UIWebView => WKWebView等效 关于您可以写: 对于:

  • 考虑: 为什么,我怎么才能让它起作用? 我的CPU是i5-10210u(支持AVX-256)。在X64版本/调试中运行。

  • TypeScript不是凭空存在的。 它从JavaScript生态系统和大量现存的JavaScript而来。 将JavaScript代码转换成TypeScript虽乏味却不是难事。 接下来这篇教程将教你怎么做。 在开始转换TypeScript之前,我们假设你已经理解了足够多本手册里的内容。 如果你打算要转换一个React工程,推荐你先阅读React转换指南。 如果你在写纯JavaScript,你大

  • 我正在将我的应用程序从Log4J1.2迁移到Log4J2-2.8.1版本。下面是log4j.properties文件中现有的1.x配置。

  • 我正在从log4j1迁移。由于最近的漏洞,x到log4j2。另一个依赖项似乎引用了旧的log4j1。x文件。 除了删除旧的log4j1. x文件之外,我还添加了log4j-core、log4j-api和log4j-1.2-api所有2.16版本。我查阅了迁移的留档https://logging.apache.org/log4j/2.x/manual/migration.html,并认为最后一个ja