【发布时间】:2022-01-29 04:25:49
【问题描述】:
我对这个问题有点迷茫。
Pre-packaged database has an invalid schema 错误有以下输出:
预期
TableInfo{name='account', columns={client_alt_phone_on_route_sheets=Column{name='client_alt_phone_on_route_sheets', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='0'}, client_titles_on_address_labels=Column{name='client_titles_on_address_labels', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='0'}, client_titles_on_invoices=Column{name='client_titles_on_invoices', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='0'}}, foreignKeys=[], indices=[]}
找到
TableInfo{name='account', columns={client_alt_phone_on_route_sheets=Column{name='client_alt_phone_on_route_sheets', type='BOOLEAN', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='FALSE'}, client_titles_on_address_labels=Column{name='client_titles_on_address_labels', type='BOOLEAN', affinity='1', notNull=false, primaryKeyPosition=0, defaultValue='FALSE'}, client_titles_on_invoices=Column{name='client_titles_on_invoices', type='BOOLEAN', affinity='1', notNull=false, primaryKeyPosition=0, defaultValue='FALSE'}}, foreignKeys=[], indices=[]}
我省略了其他一些列,因为它们不是问题并且它们的输出匹配。问题在于预期 INTEGER 但找到 BOOLEAN 的列。
数据库架构如下:
CREATE TABLE account
(
client_alt_phone_on_route_sheets BOOLEAN DEFAULT FALSE NOT NULL,
client_titles_on_address_labels BOOLEAN DEFAULT FALSE,
client_titles_on_invoices BOOLEAN DEFAULT FALSE,
// Omitted rows
);
最初,我确实创建了account Room @Entity,其中BOOLEAN 列类型为Boolean:
@Entity(tableName = "account")
data class Account(
// Omitted data
// @FIXME
@ColumnInfo(name = "client_alt_phone_on_route_sheets", defaultValue = "FALSE") val routeSheetsClientAltPhone: Boolean,
// @FIXME
@ColumnInfo(name = "client_titles_on_address_labels", defaultValue = "FALSE") val clientTitlesOnAddressLabels: Boolean?,
// @FIXME
@ColumnInfo(name = "client_titles_on_invoices", defaultValue = "FALSE") val clientTitlesOnInvoices: Boolean?,
)
然后,第一次抛出错误时,我确实将 Boolean 类型列更改为 Int 类型:
@Entity(tableName = "account")
data class Account(
// Omitted data
// @FIXME
@ColumnInfo(name = "client_alt_phone_on_route_sheets", defaultValue = "0") val routeSheetsClientAltPhone: Int,
// @FIXME
@ColumnInfo(name = "client_titles_on_address_labels", defaultValue = "0") val clientTitlesOnAddressLabels: Int?,
// @FIXME
@ColumnInfo(name = "client_titles_on_invoices", defaultValue = "0") val clientTitlesOnInvoices: Int?,
)
但是,错误不断发生。我尝试使用 this answer 迁移单个列以查看它是否匹配预期/找到的输出。
private val MIGRATION_1_2 = object : Migration(1,2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(
"ALTER TABLE account ADD COLUMN client_alt_phone_on_route_sheets INTEGER NOT NULL DEFAULT(0)"
)
}
}
private fun buildDatabase(context: Context) = Room.databaseBuilder(
context.applicationContext,
Database::class.java,
Constants.DATABASE_NAME
).addMigrations(MIGRATION_1_2).createFromAsset("database.db").build()
但显然迁移不起作用,也没有更改输出中的任何内容,因为错误仍然相同。另外,我不确定哪个是 Room 数据库,哪个是资产数据库。我的预感是“找到”输出是与资产匹配的输出,因为BOOLEAN 类型,但这并不完全清楚。为什么将 Room @ColumnInfo 值类型从 Boolean 更改为 Int 似乎没有生效?如果需要为我的数据库上BOOLEAN 类型的每一列实施上述迁移,那么对多个表应用迁移的正确方法是什么? (因为我有更多具有这种BOOLEAN 类型的表,尽管它们没有出现错误)
【问题讨论】:
标签: kotlin android-room android-room-prepackageddatabase