Sqlite 到 Room DB 迁移亲和力问题

问题描述 投票:0回答:1

我有 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 在生产运行的应用程序上已经且不能更改。)

android android-sqlite android-room android-jetpack android-room-migration
1个回答
0
投票

与 SQLite 的灵活类型不同,Room 将类型限制为 INTEGER、TEXT、REAL 或 BLOB。因此,您需要转换预先存在的数据库,以便表仅使用这些类型。

  • Room 还期望列定义的其他部分符合其架构,例如 NOT NULL。

确定 Room 期望的最简单方法是

  1. 创建
    @Entity
    带注释的类。
  2. 使用
    @Database
    注释中包含的实体创建一个
    @Database
    带注释的类。
  3. 编译项目。
  4. 在 Android 视图中,在 java(生成的)directort/文件夹中找到该类,该类与
    @Database
    带注释的类同名,但后缀为 _Impl
  5. 在类中找到
    createAllTables
    函数。这将执行 Room 用于创建表的SQL,并且完全符合 Room 的预期。

生成的 SQL 应该用于创建表,这可以通过运行转换过程来实现:-

  1. 重命名原始表
  2. 使用生成的 SQL 创建表
  3. 使用
    INSERT .... SELECT ....
  4. 填充新创建的表
  5. 删除重命名的原始表

可以在将数据库复制到资产文件夹之前使用 SQLite 工具完成转换。或者,您可以使用

prePackagedDatabaseCallback
使用相同的转换过程动态转换数据库。

© www.soinside.com 2019 - 2024. All rights reserved.