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

Android Room自动迁移新列不工作

邓德本
2023-03-14

我在stackoverflow中搜索了一个类似的问题,但没有找到,不同情况下的其他可能解决方案也不适合我。我打开这个问题是因为我找不到这个问题的解决方案,也找不到这个问题的类似问题。

我尝试过使用Android Room的自动迁移功能,但它从未正常工作。

目前的情况如下:

我有一个数据库版本1

我想向一个表添加一个新列,这是我想做的唯一修改。此列将保存字符串值,而不保存其他任何内容。

此新列将仅存在于数据库版本2中

我已按照Android留档设置数据库

当我再次运行应用程序时(数据库版本为1的应用程序填充了数据),应用程序崩溃

控制台中的崩溃错误如下:

2021-08-24 21:35:53.941 3081-3141/com.app.test E/AndroidRuntime: FATAL EXCEPTION: pool-18-thread-2
    Process: com.app.test, PID: 3081
    java.lang.IllegalStateException: Migration didn't properly handle: My(com.com.app.test.data.datbase.entity.MyEntity).
     Expected:
    TableInfo{name='My', columns=long list of column definitions}
     Found:
2021-08-24 21:35:53.942 3081-3141/com.app.test E/AndroidRuntime: TableInfo{name='My', columns=long list of column definitions, plus the new one}

我已使用新版本号 (2) 设置了数据库,并将导出模式设置为 true,并将自动迁移从 1 定义为 2。

我还在应用程序 gradle 配置选项中定义了 schemaLocation。

我找不到任何地方解释为什么这不起作用,这是一个简单的操作,将新列添加到现有表中。

有谁知道为什么这不起作用,我如何让它工作而不必手动编写迁移?

编辑:仔细检查后,数据库迁移中的默认值定义似乎存在一些问题。

预期显示具有非空默认值的列,这是正确的< code > default value = ' ' NOT _ NOTIFIED ' '

找到的显示为空,这是不正确的defaultValue='NULL'

该实体的列定义如下所示

@ColumnInfo(name = "notified", defaultValue = "NOT_NOTIFIED")
public String notified = "NOT_NOTIFIED";

但不知何故,它正在生成默认值为null的定义或迁移,而不是我将其设置为的值。

共有3个答案

禄源
2023-03-14

指定列Info名称和默认值对我来说是诀窍

国兴文
2023-03-14

我最近也遇到了同样的问题,对我来说,问题是我忘记了我之前写的一个版本号相同的手动迁移。

这可能不是您的情况,但为了找出为什么我得到了错误的迁移,我在<code>RoomOpenHelper的<code>onUpgrade导致我忘记了手动迁移。所以尝试一下,它可能会为你提供更多关于正在发生什么的信息。

支嘉祥
2023-03-14

从实体本身的列定义中删除defaultValue似乎可以达到目的,但需要为该列设置默认值。这似乎不是正确的行为,而是自动迁移逻辑中的某个错误。

希望有人可能知道发生了什么,并提出一个正确的解决方案,即不删除defaultValue定义。

 类似资料:
  • The migration CLI automatically migrates your v1 website to a v2 website. info Manual work is still required after using the migration CLI, as we can't automate a full migration The migration CLI migr

  • 当我使用laravel迁移在数据库中创建表时,我遇到了这个问题。我不知道它可能有什么问题,因为我在以前的系统上使用相同的命令。这是我在使用作曲家创建表时得到的错误。 $php artisan迁移迁移表已成功创建。 [Illumb\Database\QueryException]SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter

  • 我是Android应用程序开发的新手,目前正在开发一个现有的Android应用程序。从Android文档链接https://developer.Android.com/distribute/best-practices/develope/target-sdk中可以看出,应用程序更新必须至少针对Android9.0。 因此,我将targetSDKVersion设置为28,并尝试运行应用程序,但res

  • 如何在Laravel迁移和存在表中添加列自动增量,但不是主键,它的主键是。我使用Laravel 5.7和pgsql。

  • This manual migration process should be run after the automated migration process, to complete the missing parts, or debug issues in the migration CLI output. Project setup package.json Scoped package

  • 尝试为新实体/表使用自动迁移后,我发现了此错误。 迁移发生时,似乎找不到任何列。我声明我的完整性如下。 我用的是2.4.0-alpha04版本的room for all 任何帮助都非常感谢。