版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

允许有条件转载,转载请附带底部二维码。

一、前言

之前在线上产品中,一直使用的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...

从官网中就可以看到它的一些特点,有一些其实是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进行配置。

sugar-androidmanifest.png

下面简单介绍这些配置:

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

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

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

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

3、创建数据实体类

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

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

1、继承自SugarRecord。

sugar-bookmodel.png

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

sugar-bookmodel2.png

4、简单的CRUD

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

sugar-curd.png

五、Sugar高级用法

1、区分insert还是update

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

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

sugar-insertorupdate.png

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

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

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

sugar-ignore.png

3、设定查询条件去查询

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

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

sugar-query.png

4、不会SQL怎么办?

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

sugar-nosql.png

六、Sugar表结构升级

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

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

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

大体步骤如下:

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

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

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

实际操作一下:

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

sugar-addprice.png

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

Paste_Image.png

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

ALTER TABLE BOOK_MODEL ADD PRICE INTEGER

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

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

sugar-updatesql.png

七、题外话

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

公众号二维码.jpg


plokmju88
1.5k 声望132 粉丝

大家好,我是承香墨影。