高性能安卓数据库框架实战
安卓数据库框架确实很多,我使用过许多安卓数据库框架,无论是基于sqlite数据库框架ormlite,greendao,litepal。还是nosql的数据库框架snappy db,objectbox。我实战此数据库框架的目的就是在性能上向这些优秀的数据库框架靠近,在易用性做到比他们更好。接下来,我将介绍该框架基本用法以及讲述我为什么要这么写的目的。
首先我们看看这个数据库框架与几大主流的数据库框架的性能对比,结果如下所示:
自定义数据库框架插入十万条数据时间差为2651毫秒
自定义数据库框架更新十万条数据时间差为40318毫秒
自定义数据库框架删除十万条数据时间差为1401毫秒
realm插入十万条数据时间差为2063毫秒
realm更新十万条数据时间差为89853毫秒
realm删除十万条数据时间差为106660毫秒
ObjectBox插入十万条数据时间差为444毫秒
ObjectBox插入十万条数据时间差为1444毫秒
objectbox删除十万条数据时间差为275毫秒
snappyDB插入十万条数据时间差为618毫秒
litepal插入十万条数据时间差为220679毫秒
litepal更新十万条数据时间差为182659毫秒
litepal删除十万条数据时间差为16199毫秒
rmlite插入十万条数据时间差为219876毫秒
ormlite更新十万条数据时间差为176420毫秒
ormlite删除十万条数据时间差为154728毫秒
greendao插入十万条数据时间差为212657毫秒
greendao更新十万条数据时间差为158880毫秒
greendao删除十万条数据时间差为140119毫秒
可以看到这个框架是基于sqlite数据库框架性能最高的,设置与realm这样非sqlite的数据库框架也有的一拼,当然,话又说回来,这与像objectbox这样的nosql数据库框架还相差甚远,这也是下面这个数据库框架奋斗的目标。那就有两个问题,这个框架究竟怎么用,又是怎么实现的了。
其实他用法很简单,首先实例化,代码如下:
UserDao dataHelper = DaoManagerFactory.getInstance().getDataHelper(UserDao.class, User.class);
通过一个工厂方法来根据XX实体类,XXDao实体类来产生相应的实体类类型。这个和ormlite,greendao是一致的,一行代码就让您产生数据库操作类,不需要进行任何的其他配置。这个工厂方法实现就是通过Java实现多态两个厉害武器——反射与泛型实现的。
接下来我们看看实现批量插入10w条数据,相应代码如下:
List users =new ArrayList<>();
UserDao dataHelper = DaoManagerFactory.getInstance().getDataHelper(UserDao.class, User.class);
for (int i =0; i <100000; i++) {
User user =new User("jett","abc123", i);
users.add(user);
}
dataHelper.insertValues(users);
如果用传统的db.insert(XX)contentValue形式,然后通过传统循环的形式来插入数据,这样性能一定是龟速。我们这里为何不用原生sql的方式了,原生sql提供了批量插入的形式了,形式如下:
insert into persons
XXX
values
(200,'haha' , 'deng' , 'shenzhen'),
(201,'haha2' , 'deng' , 'GD'),
(202,'haha3' , 'deng' , 'Beijing');
接下来的代码就简单了,就是拼接字符串,但是,在android 原生api做了一定的限制,一次性插入sql不能太长。最多只能插入500个字,因此拼接sql用双层循环罢了。
接下来是批量更新10w条数据,用法如下:
UserDao dataHelper = DaoManagerFactory.getInstance().getDataHelper(UserDao.class,User.class);
for (int i =0; i <100000; i++) {
Useruser =new User("jason","bbc332", i);
values.add(user);
}
List wheres =new ArrayList<>();
for (int i =0; i <100000; i++) {
Useruser =new User(i);
wheres.add(user);
}
dataHelper.updateValues(values, wheres);
与insert同理可知,利用普通update加where的形式性能得不到很好的保障,我这里的利用技术栈为:
Update xxx set xxx where id in (xxxxxxx)
有了这样的思想作为指导,一样就是拼接sql的事情了,但是了这里要说一下,我对id的必要性判断没有做,后续需要优化
接下来是批量删除10w条数据,用法如下:
UserDao dataHelper = DaoManagerFactory.getInstance().getDataHelper(UserDao.class, User.class);
for (int i =0; i <100000; i++) {
User user =new User("jett","abc123", i);
users.add(user);
}
dataHelper.deleteValues(users);
与update实现原理有异曲同工之妙,这里就不做过多赘述。
最后总结,此数据库框架就是利用好sql语句优化,来利用sqlite的最大性能。如果要提升数据库框架与objectbox并驾齐驱的话,那么就需要利用ndk来构建nosql数据库。是接下来任务。代码地址: