使用SugarORM来操作SQLite
版权声明:
本账号发布文章均来自公众号,承香墨影(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的通用优点,这里总结一下:
Sugar消除了编写SQL语句与SQLite数据库进行交互的步骤。
Sugar可以自行创建数据库。
Sugar同时可以管理数据库表与对象间的关系。
Sugar提供了清晰而简单的数据库操作的API。
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也提供了非常便捷的方式升级数据库。
大体步骤如下:
首先需要在项目的「assets」目录下,心间一个叫「sugar_upgrades」的目录。
创建一个名字格式为「<version>.sql」的文件在「sugar_upgrades」目录中,
修改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其实也提供了,在一个实体类中,又包含另外一个实体类的情况,但是这样就涉及到连表查询之类的,到最后,如果业务有修改,修改起来就会很麻烦,所以一般就是简单直接的用单一的表结构,如果有必要的话,查询两次即可。