前沿介绍

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

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

项目演示效果如下:

微信 即时通讯软件

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

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

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

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

基本功能

  • 基于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
微信公众号:终端研发部

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

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

  1. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...

    先上开源地址: https://github.com/huggingface/pytorch-transformers#quick-tour 官网: https://huggingface.co/py ...

  2. 推荐一些不错的开源免费易上手的web前端框架

    1. bui 2.Semantic UI 3.oniui 转载于:https://www.cnblogs.com/ice-river/p/4963795.html

  3. android微信wcdb,一篇文章get微信开源移动端数据库组件WCDB的一切!

    1.前言 微信团队已于2017年06月09日正式开源了微信自用的移动端数据库组件 WCDB(WeChat Database),详见<[资讯] 微信正式开源移动端数据库组件WCDB!>. W ...

  4. 中秋邀请共赏图数据库-蚂蚁集团图数据TuGraph 正式开源

    目录 前言 1.五道口+蚂蚁集团的系统长什么样 2.性能拉满,能抗能打 优点: 缺点: 一.TuGraph,比关系数据库更懂关系 1.更懂关系的图数据TuGraph 2.图数据发展的三个阶段 2.1第 ...

  5. Wcdb android 目录,介绍 - 《WCDB - 腾讯开源的移动数据库框架》 - 书栈网 · BookStack...

    WCDB 相关讨论可以加我们的QQ群WCDB 技术交流群: 190485752 WCDB iOS/macOS 群: 708134978 WCDB Android 群: 868268492 WCDB W ...

  6. iOS数据库框架 WCDB的使用详解

    WCDB是一个高效.完整.易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android. 前几年的项目用到的数据库框架,都是FMDB.从最初的摸索到工具类的封装,也是经历了一 ...

  7. “易+”开源 | 简单可信赖,GameSentry 正式开源

    导读:2022 年 9 月 15日,网易智企"易+"开源计划正式发布网易易盾游戏安全测试工具--GameSentry,本文将从技术角度分析 GameSentry 的设计逻辑与设计经 ...

  8. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  9. 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里. 源代码: https://github.com/Tencent/mars 作者:男人 链接:https://zhuan ...

最新文章

  1. flutter 移动通知_Flutter移动电商实战 --(24)Provide状态管理基础
  2. error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)...
  3. 关于VUE项目地图开发中大量点标记绘制一些总结
  4. php正则表达式图谱
  5. Leetcode每日一题:164.maximum-gap(最大间距)
  6. AUTOSAR – RTE(3)任务的并发
  7. 【问底】徐汉彬:PHP7和HHVM的性能之争
  8. C#找出接口的所有实现类并遍历执行这些类的公共方法
  9. 兄dei,你的代码死循环了吗?
  10. softmgr主程序_为什么我电脑打开后,我的电脑打不开,控制面板一
  11. Raucous Rockers
  12. EVE LOM正式官宣杨洋成为品牌代言人
  13. Linux常用命令学习
  14. Leaflet地图框架使用手册
  15. uni-app学习日记7
  16. Error C2065 'cout': undeclared identifier
  17. 迷你宠物机器人Vector,随时随地与你互动
  18. 如何学习Android和大前端,并进行升级打怪
  19. Kindle开箱测评以及使用体验
  20. 【人工智能->机器学习->深度学习】

热门文章

  1. python中求合数_python输出100以内的质数与合数实例代码
  2. ubuntu从tty终端模式返回到图形桌面
  3. python动态爬取实时_python爬取动态数据实战---猫眼专业版-实时票房(二)
  4. 10个最佳企业移动支付APP应用和酷站欣赏
  5. Dell 灵越7370 装机过程遇到硬盘枷锁 bitlocker锁解决方法
  6. php实现维吉尼亚算法,python实现维吉尼亚算法
  7. Watchguard Firebox 配置DKEY动态口令认证
  8. Netty系列---源码实例
  9. Java导出Excel表格出现文件损坏异常解决方案
  10. 中止执行后超过2年_失信被执行人怎么撤销 超过两年会撤销吗