高性能安卓数据库框架实战

    安卓数据库框架确实很多,我使用过许多安卓数据库框架,无论是基于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数据库。是接下来任务。代码地址:

    https://github.com/zengchiwen/zcwdb

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容