Wcdb android 目录,WCDB漫谈

article/2025/10/9 9:55:11

前言

移动端的数据库选型一直是一个难题,直到前段时间看到了WeMobileDev(微信前端团队)放出了第三个开源组件-WCDB

WCDB(WeChat DataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案

微信团队怎么说

基于SQLCipher

WCDB-iOS/Mac

WCDB-Android

数据库损坏修复工具WDBRepair

背景

WCDB的出现可以说解决了目前移动端数据库的几个难点

首先在选型上,FMDB的SQL拼接、难以防止的SQL注入;CoreData虽然可以方便ORM,但学习成本高,稳定性堪忧,而且多线程鸡肋;另外基于C语言的sqlite我想用的人也应该不多;除了上述关系型数据库之外然后还有一些其他的Key-Value型数据库,如我用过的Realm,对于ObjC开发者来说,上手倒是没什么难度,但缺点显而易见,需要继承,入侵性强,对于单继承的OC来说这并不理想,而且对于集合类型不完全支持,复杂查询也比较无力。

高效

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

批量写操作性能测试:

批量写

ops/sec

WCDB

458000

FMDB

161000

易用 WCDB支持一句代码即可将数据取出并组合为object

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

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

像这样

[database getObjectsOfClass:WCTSampleConvenient.class

fromTable:tableName

where:WCTSampleConvenient.intValue>=10

limit:20];

完整

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

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

WCDB提供接口直接获取SQL的执行耗时,可用于监控性能。

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

ORM

在WCDB内,ORM(Object Relational Mapping)是指

将一个ObjC的类,映射到数据库的表和索引;

将类的property,映射到数据库表的字段;

这一过程。通过ORM,可以达到直接通过Object进行数据库操作,省去拼装过程的目的。

WCDB通过内建的宏实现ORM的功能。如下

9a0afed375d2

image

9a0afed375d2

image

PS:但我不建议这么做,首先要避免在.h文件中引用,因为你一旦引用,就需要改变.m文件为.mm文件,因为WCDB是基于objectiveC++;你可以使用Category特性将其隔离,在category中引用,并遵守WCTTableCoding协议,使用WCDB_PROPERTY将声明绑定到数据库表的字段。然后在模型类中引用category。达到不印象Controller和View的目的。这点官方wiki中也有提到,使用文件模板来创建。具体请见Demo

对于一个已有的ObjC类,

引用WCDB框架头文件#import ,并定义类遵循WCTTableCoding协议

WCDB_PROPERTY用于在头文件中声明绑定到数据库表的字段。

WCDB_IMPLEMENTATION,用于在类文件中定义绑定到数据库表的类。同时,该宏内实现了WCTTableCoding。因此,开发者无须添加更多的代码来完成WCTTableCoding的接口

WCDB_SYNTHESIZE,用于在类文件中定义绑定到数据库表的字段。

WCDB_PRIMARY用于定义主键

WCDB_PRIMARY_AUTO_INCREMENT 用于定义自增主键

WCDB_INDEX用于定义索引

WCDB_UNIQUE用于定义唯一约束

WCDB_NOT_NULL用于定义非空约束

CRUD

得益于ORM的定义,WCDB可以直接进行通过object进行增删改查(CRUD)操作。

//插入

Person *man = [[Person alloc] init];

man.isAutoIncrement = YES;

man.name = @"Hello, WCDB!";

man.age = 12;

return [database insertObject:man into:TABLE_WCDB_NAME];

return [database deleteObjectsFromTable:TABLE_WCDB_NAME where:Person.studentId == studentId];

Person *person = [[Person alloc] init];

person.name = content;

return [database updateRowsInTable:TABLE_WCDB_NAME onProperties:Person.name withObject:person where:Person.studentId == studentId];

NSArray * person = [database getObjectsOfClass:Person.class fromTable:TABLE_WCDB_NAME orderBy:Person.localID.order()];

Transaction

WCDB内可通过两种方式执行Transaction(事务),一是runTransaction:接口

9a0afed375d2

image

这种方式要求数据库操作在一个BLOCK内完成,简单易用。

另一种方式则是获取WCTTransaction对象

9a0afed375d2

image

WCTTransaction对象可以在类或函数间传递,因此这种方式也更具灵活性。

WINQ

WINQ(WCDB Integrated Query,音'wink'),即WCDB集成查询,是将自然查询的SQL集成到WCDB框架中的技术,基于C++实现。

免去拼接SQL字符串、防注入

借助IDE代码提示和编译器语法检查

对于一个已绑定ORM的类,可以通过className.propertyName的方式,获得数据库内字段的映射

WINQ的接口包括但不限于:

一元操作符:+、-、!等

二元操作符:||、&&、+、-、*、/、|、&、<>、、>=等

范围比较:IN、BETWEEN等

字符串匹配:LIKE、GLOB、MATCH、REGEXP等

聚合函数:AVG、COUNT、MAX、MIN、SUM等

...

原理

初衷,适应WCDB+ORM解决SQL字符串的代码冗余和难以被编译器进行语法检查而造成的错误和时间浪费。SQL字符串太容易被注入

SQL抽象

封装常用操作,覆盖80%的使用场景

暴露底层接口,适配剩余20%的特殊情况

定义常用操作

特殊场景所暴露的底层接口,应该以什么形式存在?

SELECT、DISTINCT、ALL等等大写字母是keyword,属于SQL的保留字。

result-column、``table-or-subquery、expr等等小写字母是token。token可以再进一步地展开其构成的语法规则。

将固定的keyword,封装为函数名,作为连接。

将可以展开的token,封装为类,并在类内实现其不同的组合。

在语法规则中,WHERE、LIMIT等都接受expr作为参数。因此,不管SQL多么复杂,StatementSelect也只接受Expr的参数。而其组合的能力,则在Expr类内实现。

数据库修复

官方的Dump恢复方案

遍历sqlite_master表,将未损坏的表和已损坏的前半部分读取出来将dump 出来的SQL语句逐行执行,最终可以得到一个等效的新DB

功率约为30%。

第一页就损坏后续无法读取

备份恢复方案

COPY

在DB完好的时候执行.dump

Backup API: SQLite自身提供的一套备份机制,按 Page 为单位复制到新 DB, 支持热备份。

最终选择Dump + 压缩,恢复成功率达到72%

解析B-tree恢复方案(RepairKit)

成功率约为78%

不同方案的组合

RepairKit 尝试恢复最新数据

备份恢复 遇到错误填补漏缺

Dump 最后的尝试

For Android

基本功能

基于SQLCipher的数据库加密

使用连接池实现并发读写

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

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

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

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

接入与迁移

WCDB for Android 可通过 Maven 或 AAR 包引用,API 接口与 Android SDK 非常相近, 所以将已有的 App 迁移到 WCDB 是相当容易的。

从源码编译

你可以使用预编译的依赖库(OpenSSL crypto 和 SQLCipher)来编译 WCDB for Android, 使用 Gradle 或 Android Studio 皆可。Android Studio 请导入 android 目录作为 Root Project。

编译 WCDB 需要安装 Android NDK r11c 或以上,并在 android/local.properties 上配置好 SDK 与 NDK 路径。Android Studio 一般会帮你配置好。

如果你需要自己编译 OpenSSL 等依赖项,你需要一个 Bash 环境(Windows 可以安装 Cygwin 或 MSys)、target 为本机的 C 编译器(如 GCC)、Perl 5 以及 Tcl。之后执行下面命令即可编译依赖项。

参考资料


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

相关文章

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;企业站…

四大免费开源建站系统

原文&#xff1a;四大免费开源建站系统 - 知乎 第一&#xff1a; WordPress WordPress的主流客户是企业/个人的官网。一家公司不一定会在网上卖东西&#xff0c;但一定会需要一个官网。用WordPress做官网可谓是性价比最优选择。如果没有预算&#xff0c;你可以自己买几十美金的…