liujiangchuan / liujiangchuan/BlogAndroidCN
Android数据库优化(博客搬家)
Nobody has claimed this yet.
- Dominant language
- No language data
- Stars
- 1
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
### 以下内容本人于2015/04/02 21:35在“OhwYaa|东软知识社区”平台首发,现整理到个人博客中。原址仅内部公开:https://www.ohwyaa.com/neusoft.com/blog/bccd70b1-fa3c-4649-b363-1239f18dc9cb/view/text
中国移动“和阅读”项目是以手机和移动电子书为主要形态的一款APP。自从我参与项目以来,客户端的功能也在不断的更新和完善。为了更好的服务和提升用户体验,优化的工作更是从未间断过,本次简单介绍一下Android中对SQLite数据库的使用优化以及本项目引入的ORM框架-GreenDAO。
**一、数据库优化**
**1)索引**
数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率。包括对单表查询、连表查询、分组查询、排序查询。经常是一到两个数量级的性能提升,且随着数据数量级增长。
但也要注意,索引的创建和维护存在消耗,索引会占用物理空间,且随着数据量的增加而增加。在对数据库进行增删改时需要维护索引,所以会对增删改的性能存在影响。
因此是否使用索引需要考虑项目中实际业务需求和场景而确定。
**2)事务**
使用事务的两大好处是原子提交和更优性能。
原子提交意味着同一事务内的所有修改要么都完成要么都不做,如果某个修改失败,会自动回滚使得所有修改不生效。
更优的性能表现在:SQLite默认会为每个插入、更新操作创建一个事务,并且在每次插入、更新后立即提交,这样如果连续插入100次数据实际是创建事务->执行语句->提交这个过程被重复执行了100次。如果我们显示的创建事务->执行100条语句->提交会使得这个创建事务和提交这个过程只做一次,通过这种一次性事务可以使得性能大幅提升。
**3)语句的拼接使用StringBuilder代替String**
简单的string相加会导致创建多个临时对象消耗性能。StringBuilder的空间预分配性能好得多。
**4)查询时返回更少的结果集及更少的字段。**
查询时只取需要的字段和结果集,更多的结果集会消耗更多的时间及内存,更多的字段会导致更多的内存消耗。
**5)少用cursor.getColumnIndex**
根据性能调优过程中的观察cursor.getColumnIndex的时间消耗跟cursor.getInt相差无几。可以在建表的时候用static变量记住某列的index,直接调用相应index而不是每次查询。
**6)异步线程**
SQLite是常用于嵌入式开发中的关系型数据库,完全开源。与Web常用的数据库Mysql、Oracle、sql server不同,SQLite是一个内嵌式的数据库,数据库服务器就在你的程序中,无需网络配置和管理,数据库服务器端和客户端运行在同一进程内,减少了网络访问的消耗,简化了数据库管理。不过SQLite在并发、数据库大小、网络方面存在局限性,并且为表级锁,所以也没必要多线程操作。
Android中数据不多时表查询可能耗时不多,不会导致anr,不过大于100ms时同样会让用户感觉到延时和卡顿,可以放在线程中运行,但SQLite在并发方面存在局限,多线程控制较麻烦,这时候可使用单线程池,在任务中执行db操作,通过handler返回结果和ui线程交互,既不会影响UI线程,同时也能防止并发带来的异常。
**二、GreenDAO**
GreenDAO官网中明确指明了其首要的设计目标:系统性能最大化;便于使用;对于Android高度优化;最小化内存开销;较小的文件体积,只集中在必要的部分上。优点是效率很高,插入和更新的速度是SQLite的2倍,加载实体的速度快,文件较小,占用更少的内存,操作实体灵活,支持get、update、delete等操作。缺点是学习成本较高。其中使用了一个java工程根据一些属性和规则去generate一些基础代码,类似于javaBean但会有一些规则,另外还有QueryBuilder、Dao等API,所以首先要明白整个过程,才能方便使用。不过GreenDAO的官网上也提到了这一点,正是基于generator而不是反射,才使得其效率高的多。
关于GreenDAO的使用就不多说了,建议感兴趣的话去官网([http://greendao-orm.com/](http://greendao-orm.com/))下载源码学习研究,本人也仍在努力钻研中。
目前,数据库优化还在持续进行中,相信通过更合理的结构设计与多线程访问,会更加提升客户端的性能与交互体验,希望分享的内容能够提高大家的优化意识并积累经验共勉。
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The issue contains a Chinese article about Android SQLite optimization and GreenDAO, but names no repository file, test, or entry point. First inspect how BlogAndroidCN stores blog content and determine the intended destination and acceptance criteria; the work is done when the article is placed there in the project's expected format.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java, sqlite
- Domain
- documentation, mobile-dev
- Issue type
- Documentation
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100