Room数据库是否支持实体中的布尔变量?

时间:2018-07-02 07:09:22

标签: android sqlite android-room

我知道sqlite不支持Boolean,我们需要使用int列来模仿Boolean的行为。但是Room是否支持布尔值?如果我的实体中有布尔值怎么办?它会按预期工作吗?

2 个答案:

答案 0 :(得分:8)

是的。当您使用room存储布尔值时,它会自动存储1 for true0 for false

阅读时的情况相同。它将1或0分别转换为true / false。

答案 1 :(得分:2)

添加上面@Pankaj Kumar 的回答,我想举一个迁移的例子,其中添加了一个布尔列:原始实体

    @Entity(tableName = TABLE_NAME)
    data class SessionEntity(
        @PrimaryKey(autoGenerate = true) var key: Int = 0,
        @ColumnInfo(name = "start_datetime") val startDatetime: String,
        @ColumnInfo(name = "end_datetime") val endDatetime: String,
    ) {
        companion object {
            const val TABLE_NAME = "sessions"
        }
    }

更新实体(添加布尔列)

@Entity(tableName = TABLE_NAME)
data class SessionEntity(
    @PrimaryKey(autoGenerate = true) var key: Int = 0,
    @ColumnInfo(name = "start_datetime") val startDatetime: String,
    @ColumnInfo(name = "end_datetime") val endDatetime: String,
    @ColumnInfo(name = "uploaded_attempted") val uploadAttempted: Boolean, //new Boolean column added
) {
    companion object {
        const val TABLE_NAME = "sessions"
    }
}

这是我为它写的迁移

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

可以看出,添加的列的类型为 INTEGER,它需要一个 NOT NULL 属性和一个默认值。