微信 WCDB 正式开源——高效易用的移动数据库框架

article/2025/10/9 9:55:12

前沿介绍

腾讯开源微信数据库框架WCDB,他是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。

便捷地定义表、索引、约束,并进行增删改查操作

项目演示效果如下:

Markdown

微信 即时通讯软件

  • 微信(英文名:wechat)是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序

  • 微信支持跨通信运营商、跨操作系统平台通过网络快速发送免费语音短信、视频、图片和文字

  • 同时,也可以使用通过共享流媒体内容的资料和基于位置的社交插件“摇一摇”、“漂流瓶”、“朋友圈”、”公众平台“、”语音记事本“等服务插件。

  • 腾讯于6月9日在 GMTC 全球移动技术大会上正式宣布, WCDB(WeChat Database)作为微信的一个开源组件正式对外开源

基本功能

Markdown

  • 基于SQLCipher的数据库加密

  • 使用连接池实现并发读写

  • 内建 Repair Kit 可用于修复损坏数据库

  • 针对占用空间大小优化的数据库备份/恢复功能

  • 日志输出重定向以及性能跟踪接口

  • 内建用于全文搜索的 mmicu FTS3/4 分词器
    入门

官方介绍如下:

WCDB 是一个高效、完整、易用的移动数据库框架,基于 SQLCipher,支持 iOS、macOS 和 Android。

WCDB的好处

  • WINQ(WCDB语言集成查询): 通过WINQ,开发者无须为了拼接SQL的字符串而写一大坨胶水代码。

  • ORM(Object Relational Mapping): WCDB支持灵活、易用的ORM。开发者可以很便捷地定义表、索引、约束,并进行增删改查操作。

  • 多线程高并发: WCDB支持多线程读与读、读与写并发执行,写与写串行执行。

  • 加密:WCDB提供基于SQLCipher的数据库加密。

  • 损坏修复: WCDB内建了Repair Kit用于修复损坏的数据库。

  • 反注入: WCDB内建了对SQL注入的保护。

  • 基于SQLCipher的数据库加密

  • 使用连接池实现并发读写

  • 内建 Repair Kit 可用于修复损坏数据库

  • 针对占用空间大小优化的数据库备份/恢复功能

  • 日志输出重定向以及性能跟踪接口

  • 内建用于全文搜索的 mmicu FTS3/4 分词器

相关代码(SQLiteOpenHelper类)

    /*** 类功能描述:</br>* 新数据处理帮助类* @author 于亚豪*  博客地址: http://blog.csdn.net/androidstarjack* 公众号: 终端研发部* @version 1.0 </p> 修改时间:</br> 修改备注:</br>*/
public class EncryptedDBHelper extends SQLiteOpenHelper {private static final String TAG = "EncryptedDBHelper";private static final String DATABASE_NAME = "encrypted.db";private static final String OLD_DATABASE_NAME = "plain-text.db";private static final int DATABASE_VERSION = 2;private Context mContext;private String mPassphrase;public EncryptedDBHelper(Context context, String passphrase) {// 调用“加密”版本的超类构造函数。super(context, DATABASE_NAME, passphrase.getBytes(), null, null, DATABASE_VERSION,null);// 保存上下文对象供以后使用。mContext = context;mPassphrase = passphrase;}@Overridepublic void onCreate(SQLiteDatabase db) {// 检查数据库plain-text.db是否存在 ,存在 如果是这样,将其导出到新的加密库中的。File oldDbFile = mContext.getDatabasePath(OLD_DATABASE_NAME);if (oldDbFile.exists()) {Log.i(TAG, "Migrating plain-text database to encrypted one.");//SQLiteOpenHelper在调用onCreate()之前开始一个事务。 我们必须结束事务才能附加一个新的数据库。db.endTransaction();// 将旧数据库附加到新创建的加密数据库。String sql = String.format("ATTACH DATABASE %s AS old KEY '';",DatabaseUtils.sqlEscapeString(oldDbFile.getPath()));db.execSQL(sql);// 导出旧数据库。db.beginTransaction();DatabaseUtils.stringForQuery(db, "SELECT sqlcipher_export('main', 'old');", null);db.setTransactionSuccessful();db.endTransaction();// 获取旧的数据库版本供以后升级。int oldVersion = (int) DatabaseUtils.longForQuery(db, "PRAGMA old.user_version;", null);// 分离旧数据库并输入新的事务。db.execSQL("DETACH DATABASE old;");// 旧数据库现在可以删除。oldDbFile.delete();// 在进一步的操作之前,还原事务。db.beginTransaction();// 检查我们是否需要升级架构。if (oldVersion > DATABASE_VERSION) {onDowngrade(db, oldVersion, DATABASE_VERSION);} else if (oldVersion < DATABASE_VERSION) {onUpgrade(db, oldVersion, DATABASE_VERSION);}} else {Log.i(TAG, "Creating new encrypted database.");// 如果旧数据库不存在,请进行真正的初始化。db.execSQL("CREATE TABLE message (content TEXT, "+ "sender TEXT);");}// 损坏恢复的备份主信息。RepairKit.MasterInfo.save(db, db.getPath() + "-mbak", mPassphrase.getBytes());}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.i(TAG, String.format("Upgrading database from version %d to version %d.",oldVersion, newVersion));//将新列添加到数据库升级的消息表中。db.execSQL("ALTER TABLE message ADD COLUMN sender TEXT;");//损坏恢复的备份主信息RepairKit.MasterInfo.save(db, db.getPath() + "-mbak", mPassphrase.getBytes());}}

WCDB如何查询数据库的相关示例:

new AsyncTask<Void, Void, Cursor>() {@Overrideprotected void onPreExecute() {mAdapter.notifyDataSetChanged();}@Overrideprotected Cursor doInBackground(Void... params) {if (mDB == null || !mDB.isOpen())return null;String message = "Message inserted on " + DATE_FORMAT.format(new Date());if (mDBVersion == 1) {mDB.execSQL("INSERT INTO message VALUES (?);",new Object[]{"yyh"});return mDB.rawQuery("SELECT rowid as _id, content, '???' as sender FROM message;",null);} else {mDB.execSQL("INSERT INTO message VALUES (?, ?);",new Object[]{"yyh", "男"});return mDB.rawQuery("SELECT rowid as _id, content, sender FROM message;",null);}}@Overrideprotected void onPostExecute(Cursor cursor) {if (cursor == null)return;list = getAllStudent(cursor);mAdapter.changeCursor(list);}}.execute();

WWCDB如何插入表的相关示例:

final DateFormat DATE_FORMAT = SimpleDateFormat.getDateTimeInstance();new AsyncTask<Void, Void, Cursor>() {@Overrideprotected void onPreExecute() {mAdapter.notifyDataSetChanged();}@Overrideprotected Cursor doInBackground(Void... params) {if (mDB == null || !mDB.isOpen())return null;String message = "Message inserted on " + DATE_FORMAT.format(new Date());if (mDBVersion == 1) {mDB.execSQL("INSERT INTO message VALUES (?);",new Object[]{"yyh"});return mDB.rawQuery("SELECT rowid as _id, content, '???' as sender FROM message;",null);} else {mDB.execSQL("INSERT INTO message VALUES (?, ?);",new Object[]{"yyh", "男"});return mDB.rawQuery("SELECT rowid as _id, content, sender FROM message;",null);}}@Overrideprotected void onPostExecute(Cursor cursor) {if (cursor == null)return;list = getAllStudent(cursor);mAdapter.changeCursor(list);}}.execute();

WCDB如何删除表的相关示例:

if (mDB == null || !mDB.isOpen()){return  ;}mDB.execSQL("DELETE FROM message WHERE content"+"=?",new Object[]{"yyh"});com.tencent.wcdb.Cursor cursor =  mDB.rawQuery("SELECT rowid as _id, content, sender FROM message;",null);list = getAllStudent(cursor);mAdapter.changeCursor(list);

完整demo下载地址:

相关项目下载地址(github):

https://github.com/androidstarjack/MyWCDBStudy

csdn下载链接
http://download.csdn.net/detail/androidstarjack/9880372

关于WCDB还有很多的地方要去学习,该demo中只是演示的其中的冰山一角,接下来我们还有很多要探寻的。

WCDB官方地址:

WCDB官方地址

https://github.com/Tencent/wcdb/wiki

相信自己,没有做不到的,只有想不到的

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部

Markdown

(这里 学到的不仅仅是技术)


http://chatgpt.dhexx.cn/article/fI3gBKUw.shtml

相关文章

Wcdb android 目录,WCDB漫谈

前言 移动端的数据库选型一直是一个难题&#xff0c;直到前段时间看到了WeMobileDev(微信前端团队)放出了第三个开源组件-WCDB WCDB(WeChat DataBase)是微信官方的移动端数据库组件&#xff0c;致力于提供一个高效、易用、完整的移动端存储方案 微信团队怎么说 基于SQLCipher W…

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用 前言开发前准备开发关于生成WCDB文件 选择new file即可找到关于嵌套模型的生成 分两步 选择new file即可找到增删改查的封装使用 总结 前言 iOS开发中有需要数据库的存储&#xff0c;表的增删改查等&#xff0c;FMDB和最近流行…

iOS开发通过微信学习WCDB(三)

通过之前的两篇文章对wcdb能够简单的使用了&#xff0c;这些知识储备多时&#xff0c;最近终于可以派上用场了&#xff0c;最近app有一个通讯录的新功能&#xff0c;实现联系人列表的排序&#xff0c;以及检索&#xff0c;刚好可以用用wcdb去实现。 联系人模型的建立 我首先建…

WCDB使用笔记

本地数据加密 由于项目涉及到一些用户隐私数据的存储&#xff0c;所以需要对保存在客户端本地的数据进行加密&#xff0c;以防止用户隐私数据在设备被root的情况下出现泄漏。目前android的本地数据存储基本分为file&#xff0c;sharepreference和database&#xff0c;所以对数…

iOS开发通过微信学习WCDB(一)

最近通过对微信ipa包解压发现微信有使用WCDB这个开源库&#xff0c;搜索了一下了解到WCDB&#xff08;WeChat Database&#xff09;是一个高效、完整、易用的移动数据库框架&#xff0c;基于SQLCipher&#xff0c;支持iOS, macOS和Android。经过分析对比&#xff0c;个人感觉WC…

微信移动端数据库组件 WCDB 系列(三) — 解析 WINQ 原理

背景 高效、完整、易用是 WCDB 的基本原则。前几篇文章分享了 WCDB 的基本用法和修复工具&#xff0c;接下来将更深入地聊聊 WCDB 在易用性上的思考和实践。 对于各类客户端数据库&#xff0c;似乎都绕不开拼接字符串这一步。即便在 Realm 这样的 NoSQL 的数据库中&#xff0…

WCDB源码解析

源文链接&#xff1a;http://xiangwangfeng.com/2018/01/08/WCDB-源码解析 起因 最近开了个新项目&#xff0c;项目的主程童鞋引入了 WCDB 代替原先自制的 KeyValueStore 和 FMDB。问为何&#xff0c;答曰&#xff1a;好用&#xff0c;线程安全又高效。又问具体实现细节&#x…

IOS数据存储 之WCDB (二)WCDB.swift使用篇

IOS数据存储 之WCDB &#xff08;二&#xff09;WCDB.swift使用篇 1.WCDB.Swfit基础使用1.1 WCDB.Swfit 简介1.1.1 模型绑定1.1.2 创建数据库与表1.1.3 操作数据1.1.3.1 插入操作1.1.3.2 查找操作1.1.3.3 更新操作1.1.3.4 删除操作 1.2. 模型绑定1.2.1 Swift 模型绑定1.2.2 字段…

Android使用WCDB+Room 总结

最近项目有需要用到wcdb数据库&#xff0c;并且保证和IOS互通数据&#xff0c;在网上找很多相关资料&#xff0c;最后还是靠自己一点点摸索成功&#xff0c;现在做个总结。 一、在gradle 里加上 WCDB 相关的 room 组件 def room_version "2.3.0"// wcdb数据库和roo…

IOS数据存储 之WCDB (一)

IOS数据存储 之WCDB &#xff08;一&#xff09; 1. WCDB 简介1.1 使用WCDB框架3大优势1.2 WCDB 的一些基础概念1.2.1 类字段绑定&#xff08;ORM&#xff09;1.2.2 WINQ&#xff08;WCDB语言集成查询&#xff09;1.2.2.1 字段映射与运算符1.2.2.2 字段组合1.2.2.3 AllProperti…

iOS开发 数据存储之WCDB的介绍

一.介绍 WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS,macOS和Android 二.基本特性 易用,WCDB支持一句代码即可将数据取出并组合为object WINQ(WCDB语言集成查询):通过WINQ,开发者无须为了拼接SQL的字符串而写一大坨胶水代码ORM(Object Relational Ma…

开源微信小程序自助建站系统源码 含精美的多行业模板和搭建教程

分享一个微信小程序自助建站系统源码&#xff0c;含各行各业的小程序模板和搭建教程&#xff0c;可一键切换模板&#xff0c;自由DIY&#xff0c;搭建属于你自己的小程序。 特色功能一览&#xff1a; 11、支持创建多个小程序&#xff01;&#xff08;没有数量限制&#xff0c;后…

强大易用的开源建站工具Halo

最近无意间看到别人的博客外观非常美观&#xff0c;便萌生了偷师学艺的想法…所以就看到看了Halo这个开源的建站项目,其实使用起来非常简单&#xff0c;但是想要做一个类似的开源建站工具&#xff0c;谈何容易 访问官网 https://halo.run/ 使用docker部署 搜索镜像halo do…

14个免费好用的建站工具

有时候&#xff0c;我们想建立一个独立网站的时候&#xff0c;苦于自己技能不够&#xff0c;而迟迟没有行动&#xff0c;其实&#xff0c;我们真正的去构建一个独立网站的时候&#xff0c;我们并不需要多复杂的技术。我们也不一定要成为非常专业的程序员&#xff0c;因为现在&a…

推荐一款免费开源的建站系统 - AnqiCMS

安企内容管理系统(AnqiCMS)&#xff0c;是一款使用 GoLang 开发的企业站内容管理系统&#xff0c;它部署简单&#xff0c;软件安全&#xff0c;界面优雅&#xff0c;小巧&#xff0c;执行速度飞快&#xff0c;使用 AnqiCMS 搭建的网站可以防止众多安全问题发生。AnqiCMS 的设计…

介绍一款开源、高性价比的在线教育建站系统

今天给大家介绍一款开源在线教育建站系统——edusoho&#xff0c;项目是用PHP开发&#xff0c;所以基本上会搭建php站点就可以完成本次的搭建。 先看看安装之后的登录界面。 去官网下载源码 笔者下载企培开源版&#xff1a;edusoho-ct-21.4.5.zip 系统说明 1.系统&#xff1…

国内好用的五款开源建站系统

推荐5款优秀的开源建站系统,都有免费版本,有需要可以去试试。蝉知 蝉知系统是一款开源的的企业营销自助建站系统。它专为企业营销设计,伪静态网址、关键词、语义化结构,内置流量统计。 蝉知功能全面,文章发布、会员管理、论坛评论、产品展示等,并内置商城系统,商品、订…

免费开源的建站程序大全,不会编程也可以自助搭建网站了哦

想建网站又不会编程的小伙伴有福啦&#xff0c;本期推荐一些开源的cms建站程序&#xff0c;不需要写后端的任何逻辑代码&#xff0c;轻轻松松就可以建立自己的网站了&#xff0c;当然&#xff0c;要想网站有自己的个性&#xff0c;模版还是需要自己写的&#xff0c;只需要会简单…

绝了!小说建站项目完整开源

超棒的开源小说文学建站 CMS 系统&#xff0c;作为面试项目有牌面儿&#xff01; 编程导航开源仓库&#xff1a;https://github.com/liyupi/code-nav 大家好&#xff0c;我是鱼皮&#xff0c;今天给大家推荐一个优秀的开源 Java 全栈项目。 小说精品屋&#xff0c;是一套非常完…

最新首发自助建站系统源码,傻瓜式一键建站系统源码,高度开源支持专业在线自助建站服务平台软件

一佰互联,巅云门户自助建站系统v8建站平台版&#xff0c;历经3年不断打磨终于上线了。专业PS级大师级高端响应式智能建站平台软件&#xff0c;只为网络公司而生&#xff0c;采用国内知名开源php框架,Thinkphp6vue.js前端数据响应系统,实现了在线自助开通网站&#xff0c;企业站…