SQLDelight — 从 Sql 语句中生成 Java 对象

作者: rain 分类: 移动 发布时间: 2016-05-21 23:42 6 条评论

SQLDelight 是从创建表的 CREATE TABLE 语句中创建对应的 Java 对象。创建的 Java 对象可以使用类型安全的 API 来读写数据库中的数据。SQLDelight 主要是为了方便组织 SQL 语句,并且可以简化在 Java 中使用。

SQLDelight 同时还带有 gradle 和 Android Studio 插件用来支持编辑 SQL 语句和把 SQL 语句编译为 Java 对象。

如何使用

要使用 SQLDelight ,需要把 SQL 语句放到对应的 .sq 文件中,默认目录为和 main 目录下的 java 代码同级,例如 src/main/sqldelight/com/example/HockeyPlayer.sq ,其中 com/example/ 为对应 java 对象的包名字。 在该 .sq 文件中一般第一个语句是创建表的语句:

上面的 SQL 语句会生成一个 HockeyPlayerModel Java 接口。该接口内有两个嵌套类分别把 Cursor 映射为 Java 对象以及把 Java 对象转换为 ContentValues 好插入数据库,这两个嵌套类分别称之为 Mapper 和 Marshal:

如果你使用过 AutoValue ,则可以发现上面生成的 HockeyPlayerModel 可以直接支持 AutoValue,这样可以大大减少实现这个接口需要编写的代码数量:

使用 AutoValue 自动生成对应的 Java 模型,然后用 AutoValue 生成的 Java 模型实现类来创建一个 静态的 MAPPER 。

配合 Retrolambda 则代码可以进一步简化:

这样读取数据可以使用 MAPPER, 插入数据可以使用 Marshal:

数据类型

SQLDelight 的数据列定义和普通的 SQLite 列定义一样,但是额外支持一些指定 Java 数据类型的自定义属性。SQLDelight 直接支持 Cursor 和 ContentValues 需要的数据类型:

Booleans

SQLDelight 使用和 SQLite 一样的类型来支持布尔值。但是在编写 SQL 语句的时候,可以通过额外的属性来指定该字段为布尔值,这样生成的 Java 对象的类型为 布尔值:

自定义类型

如果上面的基本类型不满足要求还可以自定义类型,直接指定对应的 Java 类型:

如果使用了自定义类型,则需要同时创建一个 ColumnAdapter 来把 Cursor 的数据转换为对应的类型;同时把 Java 类型数据转换为 ContentValues 支持的数据:

Enums

为了方便支持枚举类型,SQLDelight 包含了一个 ColumnAdapter 把枚举类型保存为 TEXT:

使用 EnumColumnAdapter

SQL 语句参数

.sq 文件中的语句也可以支持参数:

然后直接使用对应的 Java 常亮来应用这个语句:

Intellij(Android Studio) 插件

插件用来帮助编辑 .sq 文本,支持如下功能:
– 语法高亮
– 重构/查找 标识符
– 代码自动补全
– 编辑后自动生成 Model 接口

安装使用

Gradle 插件:

Intellij(Android Studio) 插件 可以通过插件安装界面,搜索在线的库(SQLDelight)

本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=993

Ɣ回顶部