返回
澳门新浦京
分类

WCDB是微信团队开源的支持Android澳门新浦京网址,微信移动端数据库组件WCDB即将开源

日期: 2020-02-14 16:34 浏览次数 : 76

摘要WCDB(WeChat DataBase)是Wechat官方的活动端数据库组件,致力于提供叁个飞快、易用、完整的移位端存储方案。如今正在筹备开源中。WCDB简要介绍WCDB(WeChatDataBase)是Wechat官方的运动端数据库组件,致力于提供一个异常快、易用、完整的位移端存款和储蓄方案。它富含多个模块:WCDB-iOS/MacWCDB-Android数据库损坏修复工具WCDBRepair方今正值筹划开源中。WCDB的支付背景对于iOS开采者来讲,数据库的能力选型一直是个令人深恶痛疾的难点。由于Apple提供的CoreData框架白璧微瑕,使得开采者们纷繁将眼光投向开源社区,搜索越来越好的蕴藏方案。 对于Wechat也是那般。数据库是Wechat内最底工的机件之风华正茂,新闻收发、联系人、生活圈等等业务都离不开数据库的扶助。为了满意须求,大家也对现存方案做了相比较切磋。目前活动端数据库方案按其促成可分为两类:关系型数据库,代表有CoreData、FMDB等。CoreData 它是苹果内建框架,和Xcode深度结合,能够很便利实行ORM;但其左边学习费用较高,不轻巧调整。稳固性也令人堪忧,相当轻便crash;四线程的支撑也正如鸡肋。FMDB 它依据SQLite封装,对于有SQLite和ObjC底工的开垦者来讲,轻易易懂,能够间接上手;而瑕疵也多亏在那,FMDB只是将SQLite的C接口封装成了ObjC接口,未有做太多别的优化,即所谓的胶水代码(Glue

摘要Wechat支付公司发布将Wechat自用的活动端数据库组件 WCDB(WeChat Database)正式对外开源。前言微信团队两周前预先报告就要开源WCDB后(详见那时候资讯《[资讯] Wechat移动端数据库组件WCDB就要开源!》),于二〇一七年0十一月09日正规开源了Wechat自用的移动端数据库组件 WCDB(WeChat Database)。WCDB简要介绍WCDB是一个飞跃、完整、易用的位移数据库框架,基于 SQLCipher,扶助 iOS、macOS 和 Android。Wechat高工何俊伟代表:“开源只是轶闻的早先,大家仍会四处对 WCDB 做校订,包涵更易用的接口、越来越好的属性、更加高的可相信性。那几个修改最后也会原封不动地在Wechat使用。”WCDB(WeChatDataBase)是Wechat官方的移动端数据库组件,致力于提供多个便捷、易用、完整的活动端存储方案。它包蕴几个模块:WCDB-iOS/Mac;WCDB-Android;数据库损坏修复工具WCDBRepair。WCDB的支出背景对于iOS开采者来讲,数据库的本领选型一向是个让人讨厌的主题素材。由于Apple提供的CoreData框架白璧微瑕,使得开垦者们纷繁将目光投向开源社区,搜索越来越好的积累方案。 对于Wechat也是这么。数据库是Wechat内最根基的组件之生机勃勃,新闻收发、联系人、生活圈等等业务都离不开数据库的扶助。为了满意急需,大家也对现存方案做了相比较研究。这段日子移动端数据库方案按其落实可分为两类:关系型数据库,代表有CoreData、FMDB等。CoreData 它是苹果内建框架,和Xcode深度结合,能够非常的低价进行ORM;但其左边学习开销较高,不易于调节。稳固性也焦心,十分轻松crash;十六线程的支撑也正如鸡肋。FMDB 它依照SQLite封装,对于有SQLite和ObjC底蕴的开垦者来讲,轻便易懂,能够直接上手;而缺点也多亏在这里,FMDB只是将SQLite的C接口封装成了ObjC接口,未有做太多别的优化,即所谓的胶水代码(Glue

 澳门新浦京网址 1

前言

运动端的数据库选型平素是三个难点,直到近日看见了WeMobileDev(Wechat前端团队卡塔尔国放出了第多个开源组件-WCDB

WCDB(WeChat DataBase卡塔尔国是Wechat官方的活动端数据库组件,致力于提供三个不慢、易用、完整的移位端存款和储蓄方案

Wechat团队已于二零一七年04月09日专门的学业开源了Wechat自用的移位端数据库组件 WCDB(WeChat Database),详见《[资讯] Wechat正式开源移动端数据库组件WCDB!》。

Code卡塔尔(قطر‎。使用进程需求用豁达的代码拼接SQL、拼装Object,并不方便人民群众。key-value数据库,代表有Realm、LevelDB、RocksDB等。Realm因其在各平台封装、优化的优势,比较受移动开拓者的招待。对于iOS开荒者,key-value的贯彻直接易懂,能够像使用NSDictionary相通接纳Realm。况且ORM透顶,省去了拼装Object的进程。但其对代码侵入性很强,Realm要求类继承PRADOLMObject的基类。那对于单世襲的ObjC,意味着无法再持续其余自定义的子类。同期,key-value数据库对较为复杂的查询现象也正如无力。可知,各类方案都有其革故革新的优势及劣势,没有最佳的,只有最切合的。而对于Wechat来讲,大家所愿意的数据库应满意:高效;增加和删除改查的急迅是数据库最大旨的必要。除了那一个之外,大家还可望能够扶持七个线程高并发地操作数据库,以应对Wechat频仍收发消息的场馆。易用;那是Wechat开源的尺度,也是WCDB的尺码。SQLite本不是三个易用的构件:为了完毕二个查询,往往大家须要写过多拼接字符串、组装Object的胶水代码。这个代码冗长繁缛,並且便于出错,大家盼望组件能集结达成那些职分。完整;数据库操作是一个千头万绪的风貌,我们期望数据库组件能完好覆盖各样场所。富含数据库损坏、监察和控制总括、复杂的查询、反注入等。鲜明,上述顺序方案都无法一心满足Wechat的必要。于是,大家造了那么些“轮子”

WCDB-iOS/Mac。WCDB通过ORM和WINQ,显示了其易用性上的优势,使得数据库操作不再冗杂。同期,通过链式调用,开荒者也能够方便地得到数据库操作的耗费时间等性子新闻。而高端用准则扩展了WCDB的法力和用法。详细的情况请见:《Wechat移动端数据库组件WCDB类别(后生可畏)-iOS根基篇》

Code卡塔尔。使用过程要求用大量的代码拼接SQL、拼装Object,并不便于。key-value数据库,代表有Realm、LevelDB、RocksDB等。Realm因其在各平台封装、优化的优势,比较受移动开采者的应接。对于iOS开采者,key-value的落到实处直接易懂,能够像使用NSDictionary同样使用Realm。而且ORM彻底,省去了拼装Object的长河。但其对代码侵入性很强,Realm供给类世襲PRADOLMObject的基类。那对于单世袭的ObjC,意味着无法再持续别的自定义的子类。同不寻常间,key-value数据库对较为复杂的查询现象也相比较无力。可知,各类方案都有其特有的优势及劣点,未有最棒的,独有最相符的。而对此微信来讲,大家所期待的数据库应满足:高效;增删改查的快捷是数据库最大旨的供给。除却,大家还是盼望望能够辅助七个线程高并发地操作数据库,以应对Wechat频仍收发消息的景色。易用;那是Wechat开源的法规,也是WCDB的准则。SQLite本不是三个易用的零零器件:为了成功叁个查询,往往大家要求写过多拼接字符串、组装Object的胶水代码。那么些代码冗长繁缛,而且便于出错,大家期望组件能统风度翩翩完结那几个任务。完整;数据库操作是叁个繁缛的景观,我们盼望数据库组件能完全覆盖各样处境。饱含数据库损坏、监察和控制总括、复杂的查询、反注入等。明显,上述顺序方案都不能够完全满足Wechat的必要。于是,我们造了那么些“轮子”

WCDB-iOS/Mac。WCDB通过ORM和WINQ,展现了其易用性上的优势,使得数据库操作不再繁杂。同一时间,通过链式调用,开采者也能够方便地得到数据库操作的耗时等属性音信。而高级用准绳扩大了WCDB的功效和用法。实际情况请见:《Wechat移动端数据库组件WCDB连串(风华正茂)-iOS幼功篇》WCDB源码下载WCDB源码托管地址:

 

Wechat团队怎么说

  • 基于SQLCipher

  • WCDB-iOS/Mac

  • WCDB-Android

  • 数据库损坏修复工具WDBRepair

澳门新浦京网址 2

WCDB背景

背景

WCDB的面世能够说解决了当下移动端数据库的多少个难点

  • 第朝气蓬勃在选型上,FMDB的SQL拼接、难以免御的SQL注入;CoreData纵然能够方便ORM,但读书花费高,稳固性堪忧,况且十二线程鸡肋;其它根据C语言的sqlite自家想用的人也相应十分少;除了上述关系型数据库之外然后还会有点此外的Key-Value型数据库,如本身用过的Realm,对于ObjC开辟者来说,上手倒是没什么难度,但瑕疵综上所述,须求继续,侵略性强,对于单袭承的OC来讲这并不完美,何况对于群集类型不完全支持,复杂查询也正如无力。
  • 高效

    • 二十四线程高并发:WCDB扶植八线程读与读、读与写并发实行,写与写串行实行。

    • 批量写操作品质测验:

      批量写 ops/sec
      WCDB 458000
      FMDB 161000
  • 易用 WCDB协理一句代码即可将数据抽出并整合为object

    • WINQ(WCDB语言集成查询State of Qatar:通过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注入的护卫

WCDB是Wechat终端的第多个开源项目。至此,微信分享出来的代码满含了热更新(即WechatTinker)、网络底子零件(详见《按时到来:Wechat自用的移动端IM互联网层跨平台组件库Mars已正式开源》)和数据库(也正是本文所说的WCDB组件),能够说是压箱底的事物都拿了出来。


ORM

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

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

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

那大器晚成历程。通过ORM,可以达到直接通过Object举办数据库操作,省去拼装进程的指标。

WCDB通过内建的宏完结ORM的职能。如下

澳门新浦京网址 3

image

澳门新浦京网址 4

image

PS:但小编不建议那样做,首先要幸免在.h文件中援用<WCDB/WCDB.h>,因为您要是引用,就需求改动.m文件为.mm文件,因为WCDB是基于objectiveC++;你能够动用Category性情将其隔断,在category中援用<WCDB/WCDB.h>,并遵从WCTTableCoding协议,使用WCDB_PROPERTY将宣示绑定到多少库表的字段。然后在模型类中援引category。到达不影象Controller和View的指标。那一点官方wiki中也会有涉嫌,使用文件模板来创制。具体请见德姆o

对此叁个已部分ObjC类,

  • 援引WCDB框架头文件#import <WCDB/WCDB.h>,并定义类遵从WCTTableCoding公约

  • WCDB_PROPERTY用来在头文件中宣称绑定到多少库表的字段。

  • WCDB_IMPLEMENTATION,用于在类公事中定义绑定到数量库表的类。同临时间,该宏内达成了WCTTableCoding。因而,开荒者无须增多更加多的代码来实现WCTTableCoding的接口

  • WCDB_SYNTHESIZE,用于在类公事中定义绑定到数码库表的字段。

  • WCDB_PRIMARY用于定义主键

  • WCDB_PRIMARY_AUTO_INCREMENT 用于定义自增主键

  • WCDB_INDEX用来定义索引

  • WCDB_UNIQUE用于定义唯意气风发限定

  • WCDB_NOT_NULL用以定义非空节制

提及WCDB,它是在WeChat应用程序中央银行使的迅猛,完整,易于使用的位移数据库框架,它如今在iOS,MacOS和Android上可用。

      

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 *> * person = [database getObjectsOfClass:Person.class fromTable:TABLE_WCDB_NAME orderBy:Person.localID.order()];
    

Github地址:

Star数量:3312

      自个儿第一看到WCDB是Wechat支付协会群众号在二零一四年3月推送的黄金年代篇作品中(开辟者团队的Wechat号上边图片中有,值得我们关切一下),那时候就说在张罗着WCDB的开源,感到相当古怪,在五个多月前WCDB开源了!自身是近些年才临时光看的WCDB,总括一下协和的明白和上学的东西,WCDB是Wechat团队开源的支持Android,也扶植iOS,那自然也是会支撑macOS的八个运动端数据库框架,FMDB推断做iOS的99.99%的都通晓,有如Android开辟中采纳LitePal相似,都以在SQLite的根基上包裹的位移数据库框架,WCDB是Wechat团队提供一个飞跃、易用、完整的移位端存款和储蓄方案。 它包括多少个模块:

Transaction

WCDB内可因而二种情势举行Transaction(事务),一是runTransaction:接口

澳门新浦京网址 5

image

这种措施供给数据库操作在一个BLOCK内产生,轻便易用。

另大器晚成种方式则是拿到WCTTransaction对象

澳门新浦京网址 6

image

WCTTransaction对象足以在类或函数间传递,因而这种办法也更具灵活性。

依托微信的客户量和对数据库的重度信任,WCDB直击移动端数据库在iOS和Android平台存在的两样难点。在Android上,由于 SDK 提供的支撑还行,并且选拔 NDK 开采不便,自然采用系统 API 接口进行开采,提供加密接口、数据迁移、日志重定向和各类追踪设置等作用。 iOS 意况则有例外:系统提供的CoreData 学习花费非常高、品质经常,并不那么好用,因而升高易用性、保持高效和豆蔻年华体化,则是适用于iOS的WCDB设计的根本。

      1、WCDB-iOS/Mac

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等
    • ...

顾客端数据库并不是如何“性感”的技巧,比起近期相当受关心的热更新或二〇一八年来讲的AI、ACRUISER/VWrangler等等,数据库的光热并不高,可是…

      2、WCDB-Android

原理

  • 最初的心愿,适应WCDB+ORM化解SQL字符串的代码冗余和难以被编写翻译器实行语法检查而导致的大错特错和时间浪费。SQL字符串太轻易被注入
  • SQL抽象
  • 卷入常用操作,覆盖七成的运用情形
  • 爆出底层接口,适配剩余十分之三的卓殊景况
  • 概念常用操作
  • 破例现象所揭露的底层接口,应该以什么样形式存在?
  • SELECT、DISTINCT、ALL等等大写字母是keyword,归属SQL的保留字。
  • result-column、``table-or-subquery、expr等等小写字母是token。token能够再进一步地展开其构成的语法则则。
  • 将定位的keyword,封装为函数名,作为连接。
  • 将得以开展的token,封装为类,并在类内实现其分化的结合。
  • 在语法准绳中,WHERE、LIMIT等都选择expr作为参数。由此,不管SQL多么复杂,StatementSelect也只选择Expr的参数。而其组合的力量,则在Expr类内实现。

本文收录了关于Wechat移动端数据库WCDB的到近期结束一切细节,要是你有丰裕的意志力读完以下内容,相信您便会爱上那套Wechat开源的化解方案。

      3、数据库损坏修复工具WCDBRepair

数据库修复

  • 合法的Dump恢复生机方案
    • 遍历sqlite_master表,将未损坏的表和已破坏的前半有的读收取来将dump 出来的SQL语句逐行施行,最后得以博得八个等同的新DB
      功率约为十分三。
    • 首先页就磨损后续无法读取
  • 备份苏醒方案
    • 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 或 AA本田UR-V 包引用,API 接口与 Android SDK 极其周边, 所以将已部分 App 迁移到 WCDB 是一定轻巧的。
    • Android 接入与迁移
  • 数据库修复

    • Android 数据库修复
  • 从源码编译

    • 你可以运用预编写翻译的重视库(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。之后实行下边施命发号就可以编写翻译看重项。

参谋资料

Demo

Wechat移动端数据库组件WCDB体系(生龙活虎)-iOS功底篇

Wechat移动端数据库组件WCDB种类(二) — 数据库修复三板斧

微信移动端数据库组件WCDB连串(三) — WINQ原理篇

Wechat移动数据库组件WCDB(四) — Android 本性篇

澳门新浦京网址 7

iOS 数据库框架比较深入分析    

WCDB是二个高效、完整、易用的移动数据库框架,基于 SQLCipher,援助iOS、macOS 和 Android。微信高工何俊伟表示:“开源只是轶闻的初阶,大家仍会不断对 WCDB 做改善,包罗更易用的接口、越来越好的性质、更高的可相信性。那一个修正最后也会未有丝毫退换地在Wechat使用。”


WCDB(WeChat DataBase)是Wechat官方的位移端数据库组件,致力于提供三个飞快、易用、完整的移位端存款和储蓄方案。

 

它包括四个模块:

      生机勃勃:关系型数据库,代表有CoreData、FMDB等

WCDB-iOS/Mac;

WCDB-Android;

数据库损坏修复工具WCDBRepair。

      CoreData:Wechat团队在大伙儿号的稿子中对它的总计是那样:它是苹果内建框架,和Xcode深度整合,能够很便利进行ORM;但其侧边学习成本较高,不轻便调节。牢固性也忧郁,超轻巧crash;三十二十四线程的扶助也相比较鸡肋。

更加多介绍,详见《[资讯] Wechat移动端数据库组件WCDB就要开源!》。

      FMDB:它根据SQLite封装,对于有SQLite和ObjC功底的开垦者来讲,轻松易懂,能够一贯上手;而劣势也多亏在这里,FMDB只是将SQLite的C接口封装成了ObjC接口,未有做太多别的优化,即所谓的胶水代码(Glue CodeState of Qatar。使用进程须要用大方的代码拼接SQL、拼装Object,并不方便人民群众

对于iOS开采者来讲,数据库的手艺选型一向是个令人讨厌的主题材料。由于Apple提供的CoreData框架救经引足,使得开采者们纷繁将目光投向开源社区,找出越来越好的寄存方案。

 

对于Wechat也是如此。数据库是Wechat内最根底的零件之大器晚成,音信收发、联系人、交际圈等等业务都离不开数据库的支撑。为了满意供给,我们也对现成方案做了对待钻探后意识,开采本来就有方案都不能够满意Wechat的渴求,于是WCDB应时而生。

      二:key-value数据库,代表有Realm、LevelDB、RocksDB等

详见:《微信移动端数据库组件WCDB体系-iOS底子篇》

      Wechat团队对地方的下结论是这么:因其在各平台封装、优化的优势,相比受移动开拓者的应接。对于iOS开垦者,key-value的达成直接易懂,可以像使用NSDictionary相符采纳Realm。何况ORM深透,省去了拼装Object的长河。但其对代码侵入性很强,Realm供给类世袭HavalLMObject的基类。那对于单世袭的ObjC,意味着无法再持续别的自定义的子类。同一时候,key-value数据库对较为复杂的查询现象也正如无力。

长期以来SQLite DB都有毁损难点,从Android、iOS等运动系统,到Windows、Linux 等桌面系统都会并发。由于Wechat全体音讯都保存在DB,服务端不保留备份,朝气蓬勃旦损坏将引致客户音讯被清空,显著不能够经受。

 

WCDB (WeChat Database卡塔尔,致力于清除 DB 损坏导致数据遗失的难点,提供修复工具组合套拳。