我有一个预先存在的SQLite数据库,日期、时间保存为记号,因此SQLite列是Bigint.我该如何为此创建一个roomdb实体?

我try 在RoomDb中使用Long,但在生成数据库时它显示为整数,我还try 使用将Long转换为DateTime,但它仍然存储为整数.

推荐答案

我try 在RoomDb中使用Long,但在生成数据库时它显示为整数,我还try 使用将Long转换为DateTime,但它仍然存储为整数.

也就是说,正确的LONG(Kotlin)将存储在SQLite类型为INTEGER的列中,该列可以保存63位有符号整数值.

尽管在SQLite中,列类型非常灵活(在大多数情况下,任何类型的值都可以存储在任何类型的列中),但Room需要严格得多的列类型,限制为

  • 实数(十进制类型),
  • 整数(一个整数类型,可以小到布尔值,也可以大到长整型)
  • 文本(字符流,如字符串)
  • BLOB(字节流,如字节数组)

仅当@Entity注释类中的字段不是直接(Room满足上述要求),如其他对象(例如,Date)时,才需要TypeConverter.

如果您有一个预先存在的数据库,那么很可能需要对其进行转换以满足Room的期望.

你提到BIGINT是一种类型.房间不会接受这个的.列类型必须更改为整型.列类型的转换(以及重要的约束,如NOT NULL)MUST符合Room的预期.

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

  1. 定义@Entity个带注释的类.
  2. 将它们包含在@Database‘S entities参数中.
  3. 成功编译项目(CTRL+F9)
  4. 通过Android View找到Java(生成的)目录.
  5. 在目录中,找到与@Database注释类同名的文件/类.
  6. 在这个类中,找到了SQL AllTables函数,它包含了SQL Room用来创建表,即Room所期望的表EXACTLY.

当然,在使用BIGINT作为列类型的情况下,数据库可能需要转换.这可以在将数据库文件作为assets资源 包括之前进行,也可以通过预打包的数据库回调进行.

Kotlin相关问答推荐

在Kotlin中将ClosedRange字符串转换为List?<>

kotlin短路列表判断吗?

Kotlin 协程按顺序执行,但仅在生产机器上执行

如何连接两个 kotlin 流?

多次运行espresso测试

TestContainers PostgreSQLContainer 与 Kotlin 单元测试:Not enough information to infer type variable SELF

如何使用 Findbugs 避免 kotlin 文件

Kotlin 协程中的 Dispatchers.Main 和 Dispatchers.Default 有什么区别?

Kotlin 中的部分类委托

带有迭代器函数的 Kotlin 无限序列

Kotlin惰性默认属性

如果我可以将 Flow 和 StateFlow 与生命周期范围 \ viewLifecycleOwner.lifecycleScope 一起使用,那么在 ViewModel 中使用 LiveData 有什么意义

Android Studio 将 Java 转换为 Kotlin 错误无法推断此参数的类型

RecyclerView SnapHelper无法显示第一个/最后一个元素

空对象引用上的 TransitionSet ArrayList.size()

指定为非null的参数在ArrayAdaper中为null

导航架构组件 - 未生成 DestinationFragmentArgs

内联 Kotlin 方法没有覆盖报告

Kotlin - 如果不为空,则使用修改后的 Obj props 覆盖 Obj props

如何在 Kotlin 中将串联转换为模板