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

Room数据库迁移不能正确处理ALTER TABLE迁移

汤博
2023-03-14

预期:

找到TableInfo{name='user',Columns={name=Column{name='name',Type='text',NotNull=False,PrimaryKeyPosition=0},Age=Column{name='Age',Type='integer',NotNull=True,PrimaryKeyPosition=0},ID=Column{name='id',Type='integer',NotNull=True,PrimaryKeyPosition=1}},ForeignKeys=[]}:

找到

@Entity(tableName = "user")
  public class User {

  @PrimaryKey
  private int id;

  @ColumnInfo(name = "name")
  private String name;

  @ColumnInfo(name = "age")
  private int age;


  public int getId() {
      return id;
  }

  public void setId(int id) {
      this.id = id;
  }

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public int getAge() {
      return age;
  }

  public void setAge(int age) {
      this.age = age;
  }
}

数据库类

@Database(entities = {User.class}, version = 2)
public abstract class RoomDatabaseImpl extends RoomDatabase {
    abstract UserDao userDao();
}

迁移代码

public static Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE 'user' ADD COLUMN 'age' INTEGER");
    }
 };

它叫

Room.databaseBuilder(context, RoomDatabaseImpl.class, "Sample.db")
            .addMigrations(MIGRATION_1_2)
            .allowMainThreadQueries()
            .build();

在更改对象之前,添加age并执行迁移,我添加了两个register(注册表),这样就可以工作了。

  User user = new User();
  user.setName("JoooJ");
  user.setId(3);
  user.setAge(18);

  List<User> userList = new ArrayList<>();
  userList.add(user);
  App.database(this).userDao().insertAll(userList);  // The crash happens here

其他信息:

Android Studio3和我没有在实际中进行测试

依赖项:

compile "android.arch.persistence.room:runtime:1.0.0-alpha9-1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha9-1"

compile "android.arch.persistence.room:rxjava2:1.0.0-alpha9-1"
gradle 2.3.3

共有1个答案

西门奇希
2023-03-14

错误消息很难解析,但有一个区别:

找到TableInfo{name='user',Columns={name=Column{name='name',Type='text',NotNull=False,PrimaryKeyPosition=0},Age=Column{name='Age',Type='integer',NotNull=True,PrimaryKeyPosition=0},ID=Column{name='id',Type='integer',NotNull=True,PrimaryKeyPosition=1}},ForeignKeys=[]}:

找到

TableInfo{name='user',Columns={name=Column{name='name',Type='text',NotNull=False,PrimaryKeyPosition=0},ID=Column{name='id',Type='integer',NotNull=True,PrimaryKeyPosition=1},Age=Column{name='Age',Type='integer',NotNull=False,PrimaryKeyPosition=0},ForeignKeys=[]}

年龄可以为空,但房间希望它不为空。

将迁移更改为:

database.execSQL("ALTER TABLE 'user' ADD COLUMN 'age' INTEGER NOT NULL");

由于这个异常解释很难解析,所以我创建了一个小脚本来为您执行diff。

示例:

mig "java.lang.IllegalStateException: Migration failed. expected:TableInfo{name='user', columns={name=Column{name='name', type='TEXT', notNull=false, primaryKeyPosition=0}, age=Column{name='age', type='INTEGER', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[]} , found:TableInfo{name='user', columns={name=Column{name='name', type='TEXT', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, age=Column{name='age', type='INTEGER', notNull=false, primaryKeyPosition=0}}, foreignKeys=[]}"
 类似资料:
  • 我有致命的异常:java.lang.RuntimeException:计算数据库实时数据时出现异常。在崩溃报告中 为什么TableInfo中的所有内容都是空的 谁能帮我一下,我真的不知道我做错了什么或者是不是一个bug。

  • 我有一个由Ormlite实现的现有数据库。我正在尝试用Ormlite生成的现有sqlite文件迁移到Room。 当我们在ormlite中为表列使用long数据类型时,它在SQLite中被转换为BIGINT。因此,创建的模式包含BIGINT类型的列,而BIGINT类型对于Room是未知的。当我尝试用Room升级应用程序时,我遇到了迁移异常。 java.lang.IllegalStateExcepti

  • java.lang.IllegalStateException:迁移未正确处理data_table 应为:TableInfo{name=“data_table”,columns=url=column{name=“url”,type=“text”,notnull=false,primarykeyposition=0}..... 找到:TableInfo{name='data_table',colum

  • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放

  • 在开发和维护一个数据库驱动的应用程序时, 数据库的结构会像代码一样不断演变。 例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变, Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 如下的步骤向我们展示了

  • 简介 迁移就像是数据库的版本控制, 允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的 数据库结构生成器配合使用,让你轻松地构建数据库结构。如果你曾经试过让同事手动在数据库结构中添加字段,那么数据库迁移可以让你不再需要做这样的事情。 Laravel 的 Schema 门面 对所有 Laravel 支持的数据库系统提供了创建和操作数据表的相应支持。 生成迁移 使用 Art