我有 sqlite 中的表列表,并且在一个表模式中是类似的东西
CREATE TABLE IF NOT EXIST `charges`(
`chargeId int(11) NOT NULL,
`name varchar`(256) NOT NULL,
`nameOnBill` varchar(30),
`chargeType` text,
`value` decimal(13,4) NOT NULL,
`isActive` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (chargeId))
但是当我为数据类型创建房间实体时
decimal
我使用的是 Double (为此
value decimal(13,4) NOT NULL
)
我遇到了预打包错误亲和力问题(期望亲和力 = 4 发现亲和力 = 1)。
这是我的专栏信息
@ColumnInfo(name = "value", typeAffinity = 1) val value: Double,
添加 typeAffinity = 1
也不起作用
错误: 预计:
value=Column{name='value', type='REAL', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}
发现:value=Column{name='value', type='decimal(13,4)', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}
让我知道是否有人遇到过这个问题并有解决方案,如何强制将 typeAffinity 定义为 1 (在我的情况下,SQLite DB 在生产运行的应用程序上已经且不能更改。)
与 SQLite 的灵活类型不同,Room 将类型限制为 INTEGER、TEXT、REAL 或 BLOB。因此,您需要转换预先存在的数据库,以便表仅使用这些类型。
确定 Room 期望的最简单方法是
@Entity
带注释的类。@Database
注释中包含的实体创建一个 @Database
带注释的类。@Database
带注释的类同名,但后缀为 _Impl。createAllTables
函数。这将执行 Room 用于创建表的SQL,并且完全符合 Room 的预期。生成的 SQL 应该用于创建表,这可以通过运行转换过程来实现:-
INSERT .... SELECT ....
可以在将数据库复制到资产文件夹之前使用 SQLite 工具完成转换。或者,您可以使用
prePackagedDatabaseCallback
使用相同的转换过程动态转换数据库。