使用轻便的 SugarORM ,操作 SQLite

版权声明:

本公众号发布的所有文章,未特殊署名,均属于原创,版权归本公众号所有。

转载请参阅公众号的:《转载授权》。

一、前言

之前在线上产品中,一直使用的 SugarORM(下文简称Sugar ),使用起来还是非常有好感的。但是唯一有个问题,就是太具有入侵性了,使用 Sugar 必须继承它提供的Application,只是一个 ORM 库,为了方便操作 SQLite 而已,这样确实不太友好。

但是最近发现 1.4 或者 1.5 新版本中,虽然还提供里SugarApp 这个继承 Application 这个类,但是已经把逻辑精简了,所以实际上完全可以不继承 SugarApp ,转而在合适的时机,调用 Sugar 的初始化方法即可,

既然 Sugar 已经在做出了改变,也是一个不错的时机来推荐它,接下来就 Sugar 操作 SQLite 做一个简单的介绍。

二、什么是ORM

既然要说 SugarORM,那么不得不先提一下什么是 ORM。ORM 是 Object Relational Mapping 的缩写,直译过来就是对象关系映射,是数据库开发中非常常用的技术,在各个语言中,都有类似的实现。

在编写逻辑的时候,实际上操作的都是一个个对象,而数据库通常都是关系型的,ORM 的作用就是在对象和关系型数据库之间,形成一个映射关系,这样我们在操作具体业务对象的时候,就等同于在操作关系型数据库,框架会自动将我们的操作同步到数据库中,省略了开发人员和数据库直接打交道。

而 Android 是使用 Java 开发的,它内嵌的数据库 SQLite,也需要这类型的 ORM 框架。常见的通常有: GreenDao、ORMLiet、SugarORM,GreenDao 据说是性能最好的数据库,但是它本身引用了太多其它的库,所以不够轻量级,而 ORMLite,严格起来它并不是专门用于 Android 的,所以最后,如果对性能没有太强的要求,又需要维持 apk 的体积不至于增大太多,其实 Sugar 是一个不错的选择。

三、Sugar的优点

Sugar的官网:

http://satyan.github.io/sugar/index.html

从官网中就可以看到它的一些特点,有一些其实是 ORM 的通用优点,这里总结一下:

  1. Sugar 消除了编写 SQL 语句与 SQLite 数据库进行交互的步骤。

  2. Sugar 可以自行创建数据库。

  3. Sugar 同时可以管理数据库表与对象间的关系。

  4. Sugar 提供了清晰而简单的数据库操作的 API。

  5. Sugar 它很轻量级。

四、Sugar的使用

1、引用 Sugar 到项目内

现在官网是推荐的版本是1.4,而 Github 上现在最新的版本已经到1.5了,但是其使用那个都是差不多。

所以可以直接在 Gradle 中配置。

compile 'com.github.satyan:sugar:1.4'

2、配置Sugar

Sugar 在使用之前,需要在 AndroidManifest.xml 中使用 meta-data 进行配置。

下面简单介绍这些配置:

  • DATABASE:指定 SQLite 数据库的名称。

  • VERSION:当前数据库的版本。

  • QUERY_LOG:是否记录查询的 Log。

  • DOMAIN_PACKAGE_NAME:指定创建表的类型存在的包名。

3、创建数据实体类

在项目内,我们会创建很多的类,但是为了能让 Sugar 识别,需要有特殊的标志,让 Sugar 识别出对应的数据模型类,进而在创建数据库的时候生成对应的表结构。

在Sugar中,标记一个 Model class 为 Sugar 识别的表结构,有两种方式:

1、继承自 SugarRecord。

2、使用 @Table 标签标记类。

4、简单的 CRUD

SugarRecord 中提供了丰富的 Api 用来操作数据,这里就不一一介绍啦,直接上例子。

五、Sugar 高级用法

1、区分 insert 还是 update

看到上面的例子,不管是在数据库中插入一条数据,还是更新一条已有的数据,全部使用的是 save() 方法,这样就存在一个问题,如何区分为的这次操作上插入新数据,还是更新久数据呢?

查看源码可以看到 SuargRecord 内,内嵌了一个 id 字段,id 字段在每次插入新的数据的时候,会自动自增,也就是说,我们可以通过判断 id 字段是否存在,来确定这是一次插入还是更新。

2、不想被存入数据库的字段

继承自 SugarRecord 的类中,所有的字段都会被映射到这个表结构中,但是总有一些字段是无须被存入数据库的,只是在当前环境下有效,而无需被持久化。

这个时候,可以使用@Ignore这个标签来标记字段,这样的话,在创建数据库的时候,Sugar 就会忽略掉这个字段,将不会为它创建对应的列。

3、设定查询条件去查询

既然是数据库的操作类,那么最常用的操作肯定是查询。而上面的例子中,其实查询默认只是提供了根据 id 去查询,但是实际业务场景下,id 对我们的业务而言是无意义的。

Sugar 是提供了非常便捷的定制查询的接口的,同时,如果想使用 SQL 语句进行查询,Sugar 也是提供对应的 Api 的。

4、不会 SQL 怎么办?

虽然 SQL 语句用起来非常的爽,但是前提是要有一定的 SQL 基础。Sugar 为了考虑这方面的因素,同时也增加了一些查询的构造器,来避免使用 SQL 语句进行操作。

六、Sugar 表结构升级

在实际线上项目中,随着业务的发展,总有一些情况是当初没有设想到的,需要在原有的数据库表结构上,增加字段,或者废弃字段,废弃字段还好说。这个时候就需要对已经存在的数据库进行升级,来修改表结构。

这个地方需要注意,在 Sugar 中,如果想对表结构进行修改,直接修改原本的实体类,是不行的。因为表结构只是在创建数据库的时候就已经确定了,之后再修改表结构,也是不会同步到数据库中的,如果以这种方式修改的话,对于覆盖安装的用户,就会导致崩溃。

所以需要一种安全的方式来升级数据库,Sugar 也提供了非常便捷的方式升级数据库。

大体步骤如下:

  1. 首先需要在项目的「assets」目录下,心间一个叫「sugar_upgrades」的目录。

  2. 创建一个名字格式为「<version>.sql」的文件在「sugar_upgrades」目录中,

  3. 修改AndroidManifest.xml中meta-data配置的VERSION,增加到需要的版本号。

实际操作一下:

1、首先修改BookModel,增加一个字段。

2、新增「sugar_upgrades」目录,并新建一个2.sql的文件。

3、编写 2.sql 文件,把需要更新的数据库修改的 SQL 语句,编辑在里面。

ALTER TABLE BOOK_MODEL ADD PRICE INTEGER

注意这里的数据库的表,需要把驼峰命名法中间间隔的地方,使用下划线分割,并且全部转换成大写。

3、修改AndroidManifest.xml里,版本号的配置为2。

七、题外话

Sugar 其实也提供了,在一个实体类中,又包含另外一个实体类的情况,但是这样就涉及到连表查询之类的,到最后,如果业务有修改,修改起来就会很麻烦,所以一般就是简单直接的用单一的表结构,如果有必要的话,进行二次查询即可。

iOS 专属打赏

推荐阅读:

点赞或者分享吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值