作者:sanhuazhang
WCDB(WeChat DataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案。
它包含三个模块:
它基于SQLite封装,对于有SQLite和ObjC基础的开发者来说,简单易懂,可以直接上手;而缺点也正是在此,FMDB只是将SQLite的C接口封装成了ObjC接口,没有做太多别的优化,即所谓的胶水代码(Glue Code)。使用过程需要用大量的代码拼接SQL、拼装Object,并不方便。
因其在各平台封装、优化的优势,比较受移动开发者的欢迎。对于iOS开发者,key-value的实现直接易懂,可以像使用NSDictionary一样使用Realm。并且ORM彻底,省去了拼装Object的过程。但其对代码侵入性很强,Realm要求类继承RLMObject的基类。这对于单继承的ObjC,意味着不能再继承其他自定义的子类。同时,key-value数据库对较为复杂的查询场景也比较无力。
可见,各个方案都有其独特的优势及劣势,没有最好的,只有最适合的。
而对于微信来说,我们所期望的数据库应满足:
WCDB覆盖了数据库使用的绝大部分场景,且经过微信海量用户的验证,并将持续不断地增加新的能力。
本文是WCDB系列文章的第一篇,主要介绍WCDB-iOS/Mac的基本用法,包含:
在WCDB内,ORM(Object Relational Mapping)是指
这一过程。通过ORM,可以达到直接通过Object进行数据库操作,省去拼装过程的目的。
WCDB通过内建的宏实现ORM的功能。如下
对于一个已有的ObjC类,
#import <WCDB/WCDB.h>
,并定义类遵循WCTTableCoding协议简单几行代码,就完成了将类和需要的字段绑定到数据库表的过程。这三个宏在名称和使用习惯上,也都和定义一个ObjC类相似,以此便于记忆。
除此之外,WCDB还提供了许多可选的宏,用于定义数据库索引、约束等,如:
where:Message.localID>0
onProperties:Message.content
orderBy:Message.localID.order()
这个便是WINQ。
WINQ(WCDB Integrated Query,音'wink'),即WCDB集成查询,是将自然查询的SQL集成到WCDB框架中的技术,基于C++实现。
传统的SQL语句,通常是开发者拼接字符串完成。这种方式不仅繁琐、易错,而且出错后很难定位到问题所在。同时也容易给SQL注入留下可乘之机。
而WINQ将查询语言集成到了C++中,可以通过类似函数调用的方式来写SQL查询。借用IDE的代码提示和编译器的语法检查,达到易用、纠错的效果。
对于一个已绑定ORM的类,可以通过className.propertyName的方式,获得数据库内字段的映射,以此书写SQL的条件、排序、过滤等等所有语句。如下是几个例子:
由于WINQ通过接口调用实现SQL查询,因此在书写过程中会有IDE的代码提示和编译器的语法检查,从而提升开发效率,避免写错。
WINQ的接口包括但不限于:
凡是SQLite支持的语法规则,WINQ基本都有其对应的接口。且接口名称与SQLite的语法规则基本保持一致。对于熟悉SQL的开发者,无须特别学习即可立刻上手使用。
基于ORM的支持,我们可以从数据库直接取出一个Object。然而,有时候需要取出并非是某个字段,而是有一些组合。例如:
这段代码从数据库中取出了消息的最新的修改时间,并以此将此时间作为消息的创建时间,新建了一个message。这种情况下,就可以使用as重定向。
as重定向,它可以将一个查询结果重定向到某一个字段,如下:
通过as(Message.createTime)的语法,将查询结果重新指向了createTime。因此只需一行代码便可完成原来的任务。
链式调用是指对象的接口返回一个对象,从而允许在单个语句中将调用链接在一起,而不需要变量来存储中间结果。
WCDB对于增删改查操作,都提供了对应的类以实现链式调用
where、orderBy、limit等接口的返回值均为self,因此可以通过链式调用,更自然更灵活的写出对应的查询。
传统的接口方便快捷,可以直接获得操作结果;链式接口则更具灵活性,开发者可以获取数据库操作的耗时、错误信息;也可以通过遍历逐个生成object。
WCDB内同时支持这两种接口,优势互补,开发者可以根据需求,选择使用。
SQLite支持联表查询,在某些特定的场景下,可以起到优化性能、简化表结构的作用。
WCDB同样提供了对应的接口,并在ORM的支持下,通过WCTMultiSelect的链式接口,可以同时从表中取出多个类的对象。
在ORM中,我们通过宏,将ObjC类的property绑定为数据库的一个字段。但并非所有property的类型都能绑定到字段。
WCDB内置支持的类型有:
*
的C字符串类型为了简化定义,WCDB提供了文件模版来创建类字段绑定。
1、首先需要安装文件模版。该模版的安装脚本集成在WCDB的编译脚本中,只需编译一次WCDB,就会自动安装文件模版。安装完成后重启Xcode,新建文件,即可看到对应的文件模版。
2、选择WCTColumnCoding
3、我们知道NSDate是遵循NSCoding协议的,因此这里选择了Binary类型。即,将NSDate以二进制数据的形式存到数据库中。完成后会自动创建如下的文件模版:
4、然后只需将NSDate和NSData互相转换的方式填上去即可。如下:
WCDB通过ORM和WINQ,体现了其易用性上的优势,使得数据库操作不再繁杂。同时,通过链式调用,开发者也能够方便地获取数据库操作的耗时等性能信息。而高级用法则扩展了WCDB的功能和用法。
由于篇幅所限,本文只介绍了WCDB最表层的功能。该系列接下来还将深入介绍WCDB的架构和原理,分享WCDB高并发的解决方案、WINQ实现中的思考等等。敬请期待!
本文来源于:WeMobileDev 微信公众号
相关推荐
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。