Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信移动端数据库组件 WCDB 系列:Android 特性篇(四)

微信移动端数据库组件 WCDB 系列:Android 特性篇(四)

原创
作者头像
微信终端开发团队
修改于 2017-08-07 03:40:37
修改于 2017-08-07 03:40:37
4.9K0
举报

作者:johnwhe

之前我们已经发过几篇 iOS 和修复的文章,Android 由于接口跟系统几乎一样,相信大家都比较熟悉,不熟悉用法也可以到 Android Developer 官网看一下。但是,我们也有一些特色功能和优化大家可能不容易注意到, 现在就单独拿出来说说。

加密接口

WCDB 使用了 SQLCipher 的 C 层库,但没有直接使用 SQLCipher Android 的封装层。SQLCipher Android 封装层中很多设置需要手写 PRAGMA 语句实现,比如设置 KDF 迭代次数(兼容老版本 SQLCipher DB)、设置 Page Size 等操作。

对于开发者来说,这需要了解 SQLCipher 底下的 PRAGMA 指令,更重要的是要搞清楚这些指令正确的调用顺序。 哪些是需要在设置 key 之前执行的?哪些是只有设置了 key 之后才生效的?开发者往往必须仔细查阅 SQLCipher 的文档来了解这些细节。

WCDB 对这个部分做了改进,封装了 SQLiteCipherSpec 用于设置加密参数,设置好了传给 SQLiteDatabase 工厂方法就好了,不需要考虑 PRAGMA 语法和调用顺序。

使用 SQLiteCipherSpec 另一个好处是,同样的结构可以传给 RepairKit 用于恢复损坏 DB,不需要两套 接口了。由于 RepairKit 底层不使用 PRAGMA,原来 hook 的形式不能满足需要。

另外,WCDB 将 String 类型的密码改为 byte[] 类型,可以支持非打印字符作为密码(比如 hash(user id) 方式),原来字符类型密码只要转换为 UTF-8 的 byte 数组即可,和 SQLCipher Android 兼容。

数据迁移

SQLCipher 提供了 sqlcipher_export SQL 函数用于导出数据到挂载的另一个 DB,可以用于数据迁移。 但这个函数用于 Android 的 SQLiteOpenHelper 并不方便。

SQLiteOpenHelper 主要帮助开发者做 Schema 版本管理,通过它打开 SQLite 数据库,会读取 user_version 字段来判断是否需要升级,并调用子类实现的 onCreate、onUpgrade 等接口来完成创建或升级操作。 sqlcipher_export 由于是导出而非导入,就跟 onCreate 等接口不搭了,因为要关闭原来的 DB, 打开老的 DB,执行 export 到新 DB,再重打开。

为了方便使用,WCDB 就做了扩展,将 sqlcipher_export 扩展为可以接受第二个参数表示从哪里导出, 从而实现了导入。

如此就可以不关闭原来的数据库实现数据导入,可以兼容 SQLiteOpenHelper 的接口了。详细可以看我们的 Sample。

全文搜索分词器与动态 ICU 加载

WCDB Android 自带了一个 FTS3/4 分词器,名为 mmicu,用于实现 SQLite 全文搜索。 分词器的使用与 SQLite 自带的 simple、icu 等分词器一样,创建虚拟表的时候带上名字即可:

MMICU 分词器与官方 ICU 分词器类似,但对中文(象形文字)分词以及 ICU 库加载做了特殊处理。 ICU 对中文的分词是基于词库的,Android 系统不同版本会附带不同版本的 ICU,捎带不同版本的中文 词库,当然也会带来不同的分词结果,这个对于统一产品体验是非常不利的。

另外,ICU 自带的中文词库并非非常完整,组词效果也一般,但若自带一个完整好用的词库, 又需要非常大的空间,这个空间会体现在 APK 体积上。最终,我们做了折中, 中文字全部单字成词,其他文字则使用 ICU 默认规则

ICU 还有一个严重的问题是动态库和自带的数据文件体积很大,超过 10MB,编译进 APK 里相当不划算, 最好能直接加载系统自带的 ICU 库。但加载系统库有另一个障碍:ICU 库不同版本会在函数名称后面 带上版本号后缀,直接编译时连接行不通。

为了克服这个障碍,WCDB 做了一个兼容层 icucompat,通过系统带的数据文件推断 ICU 版本, 通过 dlopen 动态加载不同的符号名称,然后通过宏来模拟直接调用方便开发。最终实现效果便是在不需要自带 ICU 库的前提下使用 ICU 库的断词、归一化等功能,为最终 APK 包省下 10MB 以上空间。

有了 ICU 兼容层,要实现 Android 框架自带的 ICU 相关功能就简单了,比如 LOCALIZED排序。 但是,WCDB 目前没有接入(主要是没有相关需求),有这方面需要的话,可以到我们的 GitHub 提 Issue 哦。

日志重定向与性能监控

SQLite 和 WCDB 框架在运行中会产生日志,这些日志默认会打印到系统日志(logcat),但这可能不是 所有开发者都希望的行为。比如担心日志里带有敏感信息,直接输出到系统不妥,或者希望将日志写到文件 用于上报和分析,WCDB 提供接口来完成日志重定向。

要实现高性能日志持久化,可以考虑使用我们 mars 里面的 xlog 组件。 微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

WCDB 还提供了性能监控接口 SQLiteTrace,实现接口并绑定到 SQLiteDatabase 可以在每次 执行 SQL 语句或连接池拥堵的时候得到回调。

SQLiteDatabase 也开放了 dump 方法,可以打印出数据库的当前状态,包括连接池内所有连接 被持有的状态以及最近执行的 SQL 语句和耗时,对排查性能和死锁问题也有很大帮助。

优化 Cursor 实现

在 WCDB 发布时,我们的一篇文章上提到 Cursor 实现优化。对于 查询获取 Cursor → 遍历 → 关闭 这种简单的场景,我们通过 SQLiteDirectCursor 直接操作 SQLite 底层的查询,避免 CursorWindow 的重复分配带来的损耗。

可以看一下我们发布时的文章: 微信WCDB进化之路 - 开源与开始

需要注意的是 Direct Cursor 未关闭前会占用一个数据库连接,使用完需要尽快关闭,否则会一直占用 造成别的线程无法请求到连接。遍历 Cursor 过程中同一线程不做其他 DB 操作,遍历完关闭,配合 WAL 使用,是最佳实践。

本文来源于:WeMobileDev 微信公众号

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
只看这一篇,你能够完全 get 微信移动端数据库 WCDB 的一切!
该文介绍了微信移动端数据库WCDB的代码开源、特性、性能优化、移动端数据库方案、SQLite、WCDB原理、版本变更等信息。
腾讯开源
2017/08/31
2.8K0
微信手机端的本地数据全文检索优化之路
基于本地数据的全文搜索(Full-Text-Search,FTS)在移动应用上扮演着重要的角色。与基于服务端提供的搜索服务不同,移动端受硬件条件限制,尤其在数据量相对较大的情况下,搜索性能问题表现得十分突出。
JackJiang
2018/08/23
2.7K1
微信手机端的本地数据全文检索优化之路
一篇文章get微信开源移动端数据库组件WCDB的一切!
微信团队已于2017年06月09日正式开源了微信自用的移动端数据库组件 WCDB(WeChat Database),详见《[资讯] 微信正式开源移动端数据库组件WCDB!》。
JackJiang
2018/08/23
1.8K1
一篇文章get微信开源移动端数据库组件WCDB的一切!
利用SQLChiper对Android SQLite数据库加密
利用SQLChiper对Android SQLite数据库加密 前言: 上篇文章讲了Android studio+SQLCipher加密SQLite数据库的几个坑,跳过这几个坑,那么SQLCipher的前提就处理完成,本片文章接着讲如何使用SQLCiper加密数据库。
红目香薰
2022/11/29
1K0
微信移动端数据库组件 WCDB 系列:数据库修复三板斧(二)
微信终端开发团队
2017/07/21
4.4K0
微信移动端数据库组件 WCDB 系列:数据库修复三板斧(二)
微信移动端数据库组件WCDB系列(一)-iOS基础篇
本文来自:微信移动客户端开发团队公众号(WeMobileDev) 前言 ---- WCDB(WeChat DataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案。 它包含三个模块: WCDB-iOS/Mac WCDB-Android 数据库损坏修复工具WCDBRepair 目前正在筹备开源中。 背景 ---- 对于iOS开发者来说,数据库的技术选型一直是个令人头痛的问题。 由于Apple提供的CoreData框架差强人意,使得开发者们纷纷将目光投向开源社区,寻找更好
腾讯Bugly
2023/04/02
2.8K0
微信移动端数据库组件WCDB系列(一)-iOS基础篇
Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析
当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。
Carson.Ho
2019/02/22
31.2K3
android学习笔记----SQLite数据库
目录一二的增删改查源码地址:https://github.com/liuchenyang0515/CreateDB3
砖业洋__
2023/05/06
1.1K0
android学习笔记----SQLite数据库
Android数据库加密
SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的读写效率、资源消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如Android、iOS)。Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,具体就不详细说明了。
全栈程序员站长
2022/08/27
2.5K0
Android数据库加密
Android SQLite数据库
SQLiteOpenHelper 抽象类有两个抽象方法:onCreate() onUpgrade() 创建和升级数据库
SakuraTears
2022/01/13
2.2K0
Android SQLite数据库基本用法详解
public class DBHelper extends SQLiteOpenHelper{
奶油话梅糖
2021/03/16
2.2K0
Android SQLite 数据库学习
  SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本。它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百kB的存储空间,这也是Android移动设备采用SQLite数据库的重要原因之一。
星哥玩云
2022/08/17
1.3K0
Android数据库安全解决方案,使用SQLCipher进行加解密
本文讲解了如何在Android项目中使用SQLCipher进行数据库加密,通过实例演示了如何在Android项目中创建一个加密的SQLite数据库,并介绍了如何使用SQLCipher进行数据查询和操作。同时,文章还介绍了SQLCipher的API,并给出了在Android项目中使用SQLCipher进行数据库加密的代码示例。
用户1158055
2018/01/05
2.3K0
Android数据库安全解决方案,使用SQLCipher进行加解密
Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)
###4.1 具体代码如下: 建议先下载Demo再进行阅读:Carson的Github:DataBase_Demo
Carson.Ho
2022/03/24
1K0
Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)
微信 WCDB 进化之路 - 开源与开始
本文来自:微信移动客户端开发团队公众号(WeMobileDev) 我们来了 ---- 今天,WCDB(WeChat Database)通过了公司的最终审核,作为腾讯微信的一个开源组件分享给大家。 从WCDB初建,到不断摸索、优化,再到整理代码、文档,最终看着她在 GitHub 上静静等待着“Make Public”被按下,心情犹如看着女儿出嫁的父亲。趁此机会,正好回顾一下 WCDB 这个“微信的数据库”的成长,分享我们的心路历程,也希望以此让大家更了解WCDB。 各自探索 ---- 最早期的微信,各个平台
腾讯Bugly
2023/04/23
1.8K0
微信 WCDB 进化之路 - 开源与开始
【Android 应用开发】Android 数据存储 之 SQLite数据库详解
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665
韩曙亮
2023/03/27
2.7K0
【Android 应用开发】Android 数据存储 之 SQLite数据库详解
基于 Android 读取微信本地 DB 数据 | 思维原理及技术分析
该移动端软件基于Android开发,是一个解析微信数据信息(包括微信个人资料、联系人、聊天记录等)并重装报文同步至服务端的一款应用。其实实属公司业务需要而开发的一个小玩意,Android嘛笑O(∩_∩)O哈哈。
AlicFeng
2019/03/04
1.3K0
WCDB 的 WAL 模式和异步 Checkpoint
通过 A/B Test,最终相比传统 Rollback 模式写耗时减少 70% 以上,还稍稍降低了 DB 损坏率。
微信终端开发团队
2018/01/29
4.7K1
WCDB 的 WAL 模式和异步 Checkpoint
微信 WCDB 进化之路:开源与开始
微信终端开发团队
2017/07/26
6K0
微信 WCDB 进化之路:开源与开始
为什么要从 FMDB 迁移到 WCDB?
微信终端开发团队
2017/08/17
3K0
为什么要从 FMDB 迁移到 WCDB?
推荐阅读
相关推荐
只看这一篇,你能够完全 get 微信移动端数据库 WCDB 的一切!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档