我到目前为止发现的内容

在编译时处理所有@entity注释的类,并生成“数据库实现”类。然后,在访问数据库之前,将调用此生成的类的validateMigration方法。这个validateMigration方法通过原始查询验证现有的数据库模式
PRAGMA table_info mytable name
(请参见android.arch.persistence.room.util.TableInfo.java的L208)

现在是问题

我的sqlite3数据库有一些列类型为BOOLEAN的列。 (它由slqite内部处理为int)。现在当我创建房间实体时说

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

房间的创建表查询将是
Create Table someEntity ( myValue INTEGER)
就像当我们使用PRAGMA table_info someEntity查询现有数据库时,我们得到
1|myValue|BOOLEAN|0||0
如上所述,room通过比较字段名称,列类型等来验证(sqlite到room)迁移。由于列类型不匹配(BOOLEAN和INTEGER),因此抛出错误,表明迁移失败。

有人可以为此建议解决方法吗?我们可以腾出空间在sqlite中创建BOOLEAN列类型吗? (此外,我们不能更改/更改现有表的列类型。)

PS:我也看到了VARCHAR的类似问题-Using an existing VARCHAR column with Room

最佳答案

使用DEFAULT值和NOT NULL定义新属性newAttribute的迁移。

代码
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")
            }
        }
    }

}

10-08 17:45