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

Bru*_*yne 6 java sqlite android android-room

到目前为止我发现了什么

在编译期间处理所有@entity带注释的类,并生成Implementation for Database类.然后在访问db之前,调用此生成的类的validateMigration方法.此validateMigration方法通过原始查询使用现有的db模式进行验证

PRAGMA table_info mytable name

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

现在问题

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

public someEntity {
     @columnInfo(name="someName")
     public Boolean myValue;
}
Run Code Online (Sandbox Code Playgroud)

房间的创建表查询将是

Create Table someEntity ( myValue INTEGER)

凡当我们查询现有的数据库与PRAGMA table_info someEntity我们得到

1|myValue|BOOLEAN|0||0

如上所述,room通过比较字段名称,列类型等来验证(sqlite到room)迁移.由于列类型不匹配(BOOLEAN和INTEGER),它会抛出错误,表示迁移失败.

任何人都可以建议一个解决方法吗?我们可以在sqlite中创建空间创建BOOLEAN列类型吗?(另外,我们无法更改/更改现有表的列类型.)

PS:我也看到了与VARCHAR类似的问题 - 在Room中使用现有的VARCHAR列

Ada*_*itz 27

使用value 和 as定义新属性newAttribute的迁移。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")
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Sum*_*man 11

SQLite 没有布尔数据类型。Room 将其映射到一INTEGER列,映射true1, false 映射到0。我认为下面的代码可以工作

database.execSQL("ALTER TABLE xyz_table ADD COLUMN abc INTEGER DEFAULT 0");
Run Code Online (Sandbox Code Playgroud)

这是无证的。