Skip to content
qiuwenchen edited this page Mar 7, 2024 · 47 revisions

WCDB 是一个易用、高效、完整的移动数据库框架,它基于 SQLite 和 SQLCipher 开发,在微信中应用广泛,且支持在 C++、Java、Kotlin、Swift、Objc 五种语言环境中使用。

易用性

One line of code 是 WCDB 设计的基本原则之一。通过更现代的数据库开发模式,减少开发者所需使用的代码量,绝大部分增删查改都只需一行代码即可完成:

// C++
database.insertObjects<Sample>(Sample(1, "text"), myTable);
database.updateRow("text2", WCDB_FIELD(Sample::content), myTable, WCDB_FIELD(Sample::id) == 1);
auto objects = database.getAllObjects<Sample>(myTable, WCDB_FIELD(Sample::id) > 0);
database.deleteObjects(myTable, WCDB_FIELD(Sample::id) == 1);
// Java
database.insertObject(new Sample(1, "text"), DBSample.allFields(), myTable);
database.updateValue("text2", DBSample.content, myTable, DBSample.id.eq(1));
List<Sample> objects = database.getAllObjects(DBSample.allFields(), myTable, DBSample.id.gt(0));
database.deleteObjects(myTable, DBSample.id.eq(1));
// Kotlin
database.insertObject<Sample>(Sample(1, "text"), DBSample.allFields(), myTable)
database.updateValue("text2", DBSample.content, myTable, DBSample.id.eq(1))
val objects = database.getAllObjects<Sample>(DBSample.allFields(), myTable, DBSample.id.gt(0))
database.deleteObjects(myTable, DBSample.id.eq(1))
// Swift
try database.insert(Sample(id:1, content:"text"), intoTable: myTable)
try database.update(table: myTable,
                    on: Sample.Properties.content,
                    with: "text2"
                    where:Sample.Properties.id == 1)
let objects: [Sample] = try database.getObjects(fromTable: myTable,
                                                where: Sample.Properties.id > 0)
try database.delete(fromTable: myTable where: Sample.Properties.id == 1)
// Objc
[database insertObject:sample intoTable:myTable];
[database updateTable:myTable
          setProperty:Sample.content
              toValue:@"text2"
                where:Sample.id == 1];
NSArray* objects = [database getObjectsOfClass:Sample.class
                                     fromTable:myTable
                                         where:Sample.id > 0];
[database deleteFromTable:myTable where:Sample.id == 1];
  1. 模型绑定。基于C++、Java、Kotlin、Swift、Objc 的语法特性,使用声明式语句建立 C++、Swift、Objc 类型与数据库表之间的映射关系,从而使得开发者可以通过类对象直接操作数据库。
  2. 范型与类型推导。WCDB 的接口与 C++、Swift、Objc 的语法相结合,使复杂的数据库操作可以以简明的方式表达出来。因此,代码不仅易于编写,而且更易于阅读和维护。
  3. 语言集成查询。深度结合 C++、Swift、Objc 和 SQL 的语法,使得纯字符串的 SQL 可以以代码的形式表达出来。结合代码提示及纠错,极大地提高了开发效率。

高效性

WCDB 基于 SQLite,并深入其源码进行了性能优化,以适配移动终端的场景。同时,对于常用且性能消耗较大的场景,如批量插入等,也做了针对性的优化。 在多线程方面,WCDB 不仅可以安全地在任意线程进行数据库操作,且其内部会智能地根据操作类型调配资源,使其能够并发执行,进一步提升效率。

完整性

WCDB 总结实践中常见的问题,为数据库开发提供更完整、全面的使用体验:

  1. 加密。基于 SQLCipher 的加密机制,为数据安全提供保障。
  2. 全文搜索。WCDB 提供简单易用的全文搜索接口,并包含适配多种语言的分词器,使得数据搜索更精准。
  3. 反注入。内建在语言集成查询中的反注入机制,可以避免第三方从输入框注入 SQL,进行预期之外的恶意操作。
  4. 字段升级。数据库模型与类定义绑定,使得字段的增加、删除、修改都与类变量的定义保持一致,不需要开发者额外地管理字段的版本。
  5. 损坏修复。修复工具可以在系统错误、磁盘故障等情况下,尽最大限度地将损坏的数据找回并导出。
  6. 数据迁移。WCDB 支持通过简单的配置将数据表迁移到其他数据库,而且让开发者可以以迁移已经完成为假定前提 进行开发,无需关心迁移的中间状态和进度。
  7. 数据压缩。WCDB 支持通过简单的配置来使用 Zstd 压缩数据表中的部分字段的内容。配置后,开发者不会感知到数据加解压的细节,而且 WCDB 会自动压缩存量数据。

兼容性

WCDB 支持 C++、Java、Kotlin、Swift、Objc 五种语言进行开发,但是这五种语言在底层是共享同一套逻辑的,整体架构如下图所示:

在这个架构下,不同语言版本的WCDB可以拥有同样的接口结构和接口能力,开发者在一个项目中只要用一个WCDB就可以满足不同语言的开发需求,不同语言的数据库逻辑不会产生冲突。一些如错误监听之类的全局接口,可以做到一处配置,同时作用于不同语言的数据库,可以节省代码,统一数据库管理逻辑。

安装与使用

WCDB 的安装和使用教程请看右侧导航栏,查看你需要使用的开发语言的文档。

Clone this wiki locally