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

Android房间迁移添加枚举列表

朱高超
2023-03-14

我在存钱

data class Settings(
    val foo: Int
)

进入我的房间数据库版本1。

现在我需要将设置扩展到

data class Settings(
    val foo: Int,
    val bar: ArrayList<Baz>
)

在哪里

enum class Baz {
    A, B, C
}

所以我需要迁移到版本2。

我有用于条形码的类型转换器。我现在正在尝试类似的东西

val MIGRATION_1_2: Migration = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE settings ADD COLUMN bar TEXT")
    }
}

但是这给了我一个IllegalStateExcture:迁移没有正确处理设置...错误。

我被卡住了。所以请帮忙!我如何让迁移工作??


共有2个答案

魏鸿哲
2023-03-14

尝试更改设置表名设置,但只通过设置。。

    database.execSQL("ALTER TABLE Settings ADD COLUMN bar TEXT")

后添加...

database =  Room.databaseBuilder(context.getApplicationContext(),
    UsersDatabase.class, "Sample.db")
    .addMigrations(MIGRATION_1_2)
    .build();

参考这个...如果只添加新表,则迁移房间数据库

龚征
2023-03-14

原来是我缺乏SQLite技能造成的。

首先,我需要设置一个默认值,因为我的bar不允许为null。其次,ALTER TABLE是非常有限的,不允许我在一行中设置默认值。

最后我做了

val MIGRATION_1_2: Migration = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE settings_new (foo INTEGER NOT NULL, bar TEXT NOT NULL, PRIMARY KEY(foo))")
        database.execSQL("INSERT INTO settings_new (foo, bar) SELECT foo, '[]' AS bar FROM settings")
        database.execSQL("DROP TABLE settings")
        database.execSQL("ALTER TABLE settings_new RENAME TO settings")
    }
}

换句话说

  1. 创建一个新的临时表(settings\u new
 类似资料:
  • 并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。

  • 问题内容: 如果需要在列表中添加枚举属性,如何声明列表?让我们说枚举类是: 我想要做: 需要用什么代替 问题答案: 如果要使用字符串类型,请使用以下命令: 否则,MByD的答案

  • 当我们在Laravel框架中运行migrate:install时,migrations表是在有两列(migration,batch)的数据库中创建的,无论如何都要添加在时间戳处创建的新列。谢谢

  • 获取以下异常: 预期: TableInfo{name='chat_table',Columns={message=column{name='message',type='text',affinity='2',notnull=false,primarykeyposition=0},messageStatus=column{name='message status',type='text',affin

  • 我有一些表,我想在这个表中添加新的列。我想添加默认值为空的字符串列。 我试着这样加上去 或 但我有一个错误

  • 我们的应用程序有DB14版本,并使用android sqllite帮助器。现在我们正在使用房间数据库,并将所有数据库的东西迁移到房间。我们已经定义了从1_2,2_3的所有迁移。到13_14,并给出所有这些int构建 这是正确的做法吗。如果我用DB14版本安装了非房间版本的应用程序,并且我试图用相同的DB14版本更新它到房间版本的应用程序,我会得到错误: IllegalStateException: