Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12543 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

14 | 存储优化(下):数据库SQLite的使用和优化

张绍文 2019-01-15
我们先来复习一下前面讲到的存储方法的使用场景:少量的 Key Value 数据可以直接使用 SharedPreferences,稍微复杂一些的数据类型也可以通过序列化成 JSON 或者 Protocol Buffers 保存,并且在开发中获取或者修改数据也很简单。
不过这几种方法可以覆盖所有的存储场景吗?数据量在几百上千条这个量级时它们的性能还可以接受,但如果是几万条的微信聊天记录呢?而且如何实现快速地对某几个联系人的数据做增删改查呢?
对于大数据的存储场景,我们需要考虑稳定性、性能和可扩展性,这个时候就要轮到今天的“主角”数据库登场了。讲存储优化一定绕不开数据库,而数据库这个主题又非常大,我也知道不少同学学数据库的过程是从入门到放弃。那么考虑到我们大多是从事移动开发的工作,今天我就来讲讲移动端数据库 SQLite 的使用和优化。

SQLite 的那些事儿

虽然市面上有很多的数据库,但受限于库体积和存储空间,适合移动端使用的还真不多。当然使用最广泛的还是我们今天的主角 SQLite,但同样还是有一些其他不错的选择,例如创业团队的Realm、Google 的LevelDB等。
在国内那么多的移动团队中,微信对 SQLite 的研究可以算是最深入的。这其实是业务诉求导向的,用户聊天记录只会在本地保存,一旦出现数据损坏或者丢失,对用户来说都是不可挽回的。另一方面,微信有很大一批的重度用户,他们有几千个联系人、几千个群聊天,曾经做过一个统计,有几百万用户的数据库竟然大于 1GB。对于这批用户,如何保证他们可以正常地使用微信是一个非常大的挑战。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • gufan
    这篇文章需要很长一段时间才能消化
    2019-01-15
    11
  • HI
    大致的看了Matrix SQLiteLint的源码实现,由于Androd N hook sqlite3_profile 会出现问题,SQLiteLint 并不能实时的获取到sql语句,而是采用java层主动的告知SQLiteLint 要分析的sql,比如分析 select *,PrepareStatement, 而对于检测 Autoincrement,冗余索引,Without RowId 而是通过native层告知java层要查询的内容,java层将查询之后的内容再通知native层,这个检测的时间间隔为4秒,这4秒是有什么依据的吗

    作者回复: 这些都是一些拍脑袋的经验值而已,也可以在GitHub上面提issue

    2019-03-11
    1
  • OF
    哎,这辈子赶不上大佬了
    2019-10-24
  • 薯条
    多线程、多进程 操作数据库的时候,可以得到一个database 对象,假如在某一个线程中调用了db.close 方法就会出现问题。看了好多方案,,最好的就如文章所说,不关闭db
    2019-10-05
  • 薯条
    时间开发中 遇到过 “多线程操作sqlite3 导致数据库损坏的问题” 没想到 微信在这块做了这么多功夫
    2019-10-05
  • godliness
    但是需要注意的是,写之间是仍然不能并发

    Android 系统默认提供的 SQLiteConnecionPool ,主连接只有一个(可写的),否则在 Java 层多线程等待(这里是等待-释放-唤醒)。不会出现 SQLiteDatabaseLockedException
    2019-09-26
    1
  • EchoSomeTH
    18:56.100 2712-2732/com.exampletest.liepin.chapter14_wcdb D/SqliteLint.Native: Lint::Check checked cnt=2
    2019-07-24 19:18:56.101 2712-2732/com.exampletest.liepin.chapter14_wcdb V/SqliteLint.Native: SqlInfoProcessor::ParseObj wildcard_sql_ = insert into message values(?)
    2019-07-24 19:18:56.102 2712-2732/com.exampletest.liepin.chapter14_wcdb V/SqliteLint.Native: Lint::PreProcessSqlInfo processRet:ret:0
    2019-07-24 19:18:56.103 2712-2732/com.exampletest.liepin.chapter14_wcdb V/SqliteLint.Native: Lint::Check() already checked recently
    2019-07-24 19:18:56.110 2712-2732/com.exampletest.liepin.chapter14_wcdb I/SqliteLint.Native: Lint::TakeSqlInfo queue empty and wait

    这是 8.0 插入一条数据,调用notifySqlExecution才出来的,这个好像···没有啥有用数据撒
    2019-07-24
  • L
    sqlite wal mode w模式sync mode 可以直接修改成OFF?若不行,怎么论证?谢谢!因为修改成OFF可以减少 DB fdatasync call

    作者回复: 可以看看:https://www.sqlite.org/pragma.html#pragma_journal_mode

    PRAGMA schema.synchronous;
    PRAGMA schema.synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL | 3 | EXTRA;

    Query or change the setting of the "synchronous" flag. The first (query) form will return the synchronous setting as an integer. The second form changes the synchronous setting. The meanings of the various synchronous settings are as follows:

    EXTRA (3)
    EXTRA synchronous is like FULL with the addition that the directory containing a rollback journal is synced after that journal is unlinked to commit a transaction in DELETE mode. EXTRA provides additional durability if the commit is followed closely by a power loss.
    FULL (2)
    When synchronous is FULL (2), the SQLite database engine will use the xSync method of the VFS to ensure that all content is safely written to the disk surface prior to continuing. This ensures that an operating system crash or power failure will not corrupt the database. FULL synchronous is very safe, but it is also slower. FULL is the most commonly used synchronous setting when not in WAL mode.
    NORMAL (1)
    When synchronous is NORMAL (1), the SQLite database engine will still sync at the most critical moments, but less often than in FULL mode. There is a very small (though non-zero) chance that a power failure at just the wrong time could corrupt the database in journal_mode=DELETE on an older filesystem. WAL mode is safe from corruption with synchronous=NORMAL, and probably DELETE mode is safe too on modern filesystems. WAL mode is always consistent with synchronous=NORMAL, but WAL mode does lose durability. A transaction committed in WAL mode with synchronous=NORMAL might roll back following a power loss or system crash. Transactions are durable across application crashes regardless of the synchronous setting or journal mode. The synchronous=NORMAL setting is a good choice for most applications running in WAL mode.
    OFF (0)
    With synchronous OFF (0), SQLite continues without syncing as s

    2019-02-17
  • 黄小木🐵
    张老师好,提个问题,我们项目当前用的是ormlite关系型数据库框架,已经利用里面的api写了大量sql语句,请问如何最低成本的替换成wcdb呢?

    作者回复: ormlite应该是ORM框架,跟底层的wcdb应该是不冲突的。

    2019-02-15
  • 嘿,抬头
    张老师,请教个问题:
    启动一个Activity,可以查出数据库中数据,但切换下系统语言,Activity重启,却查不出数据库中的数据!!!(debug看到两次都执行了查询数据库的代码)
    希望您指点一二,谢谢~

    作者回复: 输入信息太少,如果是必现可以比较好搞,这个可以直接通过sql命令行查询一下

    2019-01-15
收起评论
10
返回
顶部