SQLite 关系映射插件中实体批量刷新和覆盖的原理分析
2022-06-23施一飞王明珠
王 岩,施一飞,王明珠
(吉利学院,四川 成都 641423)
0 引言
在安卓系统中,其采用的是一款轻量化数据库SQLite,编程时如果单纯使用SQLite 原生的操作语句编写,那么在效率和容错方面会表现一般,如可以开发一款映射插件来服务和SQLite 数据库的沟通,就会在一定程度上提升编写程序的效率。经过对国内多个安卓程序产品项目的调研,发现安卓映射插件在应用中均有着不同的程度,当该程序对于后端的沟通量不是很大时,可能就没有必要安装相关映射插件,当然绝大多数的程序比较复杂,还要考虑和PC 平台及Web 平台功能的一致性[1],所以大多数都安装有公开的或者自行研发的映射插件,方便对于数据库的沟通,达到自身程序运行目的。
安卓系统的开发主要基于Java 语言,以往在使用Java 语言进行各类数据库的相关操作时,会经常用到诸如Hibernate 或MyBatis 等框架[2]。但对于SQLite 数据库,并未有类似的框架,并且安卓系统不适合使用较复杂的大型框架,只能使用一些轻量级的框架。如OrmLite 框架等,但目前能支持 SQLite 数据库的第三方框架,其种类欠丰富,功能欠完善,操作也欠优化[3]。
1 功能介绍
本次开发是在原有的ChopinLite 1.0 的版本上进行功能优化以及完善,之前的版本在添加删除上不能够进行批量添加删除,只能一次一次的进行重复操作,且占用系统内存,浪费大量时间,操作不够便捷,由此本次开发偏向批量操作等功能,着重开发以下5 个方面,本文就(4)(5)项的原理会加以重点说明。
(1)实体批量增加功能:用户在添加大量实体时,会浪费很多时间,因此为了节约用户的时间和提升用户的工作效率,在以前的基础上对其进行了优化,实现在数据库中实体批量添加数据的功能。可以更加高效的操作数据库中的内容,节约了大量的操作的时间。
(2)实体批量删除功能:删除数据的语句非常简单,但是大量的删除操作会消耗大部分时间,因此实体批量删除操作应运而生。该功能在1.0 的基础上进行优化,实现在数据库中批量删除数据的操作。
(3)实体批量修改功能:增删改作为数据库的基础操作,修改用户数据也是经常用到的功能之一。而修改数据的操作并不像添加和删除实体那样简单,所需要的代码极其烦琐。因此在数据库中实体批量修改就成了2.0 版本的重头戏。
(4)实体批量覆盖功能:覆盖操作是把本地数据上传到数据库,与批量刷新操作不同,批量覆盖是对数据库已有的实体做更新操作,没有的做添加操作,以本地数据为准。
(5)实体批量刷新功能:刷新实体同样是数据库经常进行的操作。单个实体进行刷新和批量实体刷新有所不同,需要先以数据库为基准进行判断,当实体存在于数据库时,进行选择操作,当实体并未在数据库中查询到时,进行添加操作。
2 重点研究
本次开发的框架摒弃了其他类似框架的不足之处,使用者无须编写配置文件,仅需使用框架中已经实现的各种操作方法,无须二次开发。该软件的特性在于以非循环的方式实现增删改查,更新和覆盖的批量操作。
2.1 批量添加
在实现单个实体添加的基础上,运用全新的结构化查询语言(Tructured Query Language,SQL)语句实现实体批量添加,节约用户操作时间,提升用户的工作效率,更高效的操作数据库的内容,使用 数据访问对象(Data Access Object,DAO)调用AddBatch 方法,可以批量添加实体。添加实体后,实体会自动获得身份标识号(Identity Document,ID),成为持久态。
2.2 批量删除
删除与批量添加的原理相同,使用独特的 SQL 语句,实现一次操作,批量删除的结果。解放用户繁杂的重复操作的同时减少计算机运行的压力,节约资源,实现可持续发展。
2.3 批量修改
批量修改功能在一定程度上简化修改的烦琐过程,内部程序仅采用一条 SQL 语句,达到批量修改的目的。使用 DAO 对象调用 EditBatch 方法,可以批量修改实体。(1)查询再修改,FindAll 得到集合。(2)设置需要修改的实体的各类属性。(3)最后修改集合或集合中的个例。
2.4 批量刷新
刷新实体的方法和其他功能有所不同,主要是调用了其他的方法。
刷新是以反射再赋值的方式实现了实体的批量刷新,主要是通过反射拿取数据库里的值,赋值回本地。将数据库与本地数据两者ID 做对比,若两者中存在相同ID,则把数据库中的数据下载到本地。若数据库中没有该ID,则将本地数据添加到数据库中。
使用 DAO 对象调用 AttachAndRefreshBatch 方法,可以更新实体,结果以数据库为准,使用实例如下:
2.5 批量覆盖
覆盖的操作与刷新大同小异,本软件的覆盖操作以本地数据为准,将数据上传到数据库,与批量刷新操作不同的是,批量覆盖是对数据库已有的实体做更新操作,没有的做添加操作。类似于上传的原理,通过这样的方式更新数据库,使之两边数据保持一致。
安卓使用Replace into 语句,轻松实现了预期功能,SQLite 数据库是通过直接覆盖的方式进行操作的。批量覆盖操作就是将数据库与本地数据两者ID 做对比,与刷新操作所不同的是:若两者中存在相同ID,则把数据库中的数据进行更新操作。若数据库中没有该ID,则直接进行添加操作。使用 DAO 对象调用AttachAndOverrideBatch 方法,可以更新实体,结果以数据库为准,
使用实例如下:
3 结语
安卓平台相较于其他平台,安卓具有开放性的优势,这就意味安卓拥有更多的开发者,更多的用户和应用。用户和应用的多样性会对插件的需求大量增加,可以让插件得到快速的发展。安卓还是一个开源平台,可以提供种类繁多的函数库和有用的工具,减少开发者的工作量,同时还能增加创新性和软件的交互性。目前安卓平台的相关实体映射的插件较少,增加了所研究的映射插件的实用性。
在插件设计之初,并没有考虑到用户所使用的数据库的多样性的问题,只考虑了SQLite 数据库。但实际上,一款优秀的插件则应该适应众多的软件,而不能专用化。所以,在后续的开发中,我们要让插件的适用范围更广,例如在MySQL、Oracle、SQL Server 等数据库中都可以使用。可以在Java SE 平台使用Java 数据库连接(Java Database Connect,JDBC) 工具向其他数据库进行移植,以此来满足在多种数据库中均可进行使用的目的。
综上所述,本次开发增加了批量操作的多种功能,既节省了时间,又使代码更加简练,操作更方便,节约了程序的运行内存,解放了计算机的运行压力,为后续实体映射软件的发展指明了新方向。