我对这个问题有点迷茫。
该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?,
)
但是,错误不断发生。我尝试使用此答案迁移单个列,以查看它是否与预期/找到的输出匹配。
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
类型的表,尽管它们不在错误中)