到目前为止我发现了
在编译期间处理所有@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;
}
房间的创建表格查询将是
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
答案 0 :(得分:0)
使用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")
}
}
}
}
答案 1 :(得分:0)
SQLite没有布尔数据类型。 Room将其映射到INTEGER
列,将true
映射到1
,将false映射到0
。
我认为下面的代码会起作用
database.execSQL("ALTER TABLE xyz_table ADD COLUMN abc INTEGER DEFAULT 0");
未记录。