使用现有布尔列类型的房间迁移

2022-09-02 11:46:19

到目前为止我发现了什么

所有带注释的类@entity都在编译时进行处理,并生成数据库的实现类。然后在访问数据库之前,调用此生成的类的 validateMigration 方法。此验证迁移方法通过原始查询使用现有数据库架构进行验证

PRAGMA table_info mytable name

(参见 android.arch.persistence.room.util.TableInfo 的 L208.java)

现在的问题

我的 sqlite3 db 有一些列类型为布尔值的列。(slqite 在内部处理 int)。现在当我创建房间实体说

public someEntity {
     @columnInfo(name="someName")
     public Boolean myValue;
}

文件室的创建表查询将为

Create Table someEntity ( myValue INTEGER)

当我们查询现有数据库时,我们得到PRAGMA table_info someEntity

1|myValue|BOOLEAN|0||0

如上所述,房间通过比较字段名称,列类型等来验证(sqlite到房间)的迁移。由于列类型不匹配(布尔值和整数),因此会引发错误,指出迁移失败。

任何人都可以建议解决这个问题吗?我们可以在sqlite中创建布尔列类型吗?(另外,我们不能更改/更改现有表的列类型。

PS:我还看到VARCHAR的类似问题 - 将现有的VARCHAR列与房间一起使用


答案 1

定义新属性 newAttribute 的迁移,同时使用值和 as 。DEFAULTNOT NULL

法典

database.execSQL("ALTER TABLE tableName ADD COLUMN newAttribute INTEGER DEFAULT 0 NOT NULL")

完整代码

@Database(entities = arrayOf(ModelName::class), version = 2)
@TypeConverters(Converters::class)
abstract class DatabaseName : RoomDatabase() {

    abstract fun daoName(): DaoName

    companion object {

        private var INSTANCE: DatabaseName? = null

        fun getAppDatabase(context: Context): DatabaseName {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.applicationContext,
                        DatabaseName::class.java, DATABASE_NAME)
                        .addMigrations(MIGRATION_1_2)
                        .build()
            }
            return INSTANCE as DatabaseName
        }

        val MIGRATION_1_2: Migration = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE tableName ADD COLUMN newAttribute INTEGER DEFAULT 0 NOT NULL")
            }
        }
    }

}

答案 2

SQLite 没有布尔数据类型。文件室将其映射到列,映射到 和 false 映射到 。我认为下面的代码会是工作INTEGERtrue10

database.execSQL("ALTER TABLE xyz_table ADD COLUMN abc INTEGER DEFAULT 0");

它是无证的。


推荐