http://www.ox-holdings.com

微信移动端数据库组件WCDB即将开源,数据库的技术选型一直是个令人头痛的问题

摘要Wechat支付公司公布将微信自用的移位端数据库组件 WCDB(WeChat Database)正式对外开源。前言Wechat团队两周前预先报告就要开源WCDB后(详见当时音信《[资讯] Wechat移动端数据库组件WCDB就要开源!》),于二零一七年0四月09日正式开源了微信自用的活动端数据库组件 WCDB(WeChat Database)。WCDB简单介绍WCDB是叁个神速、完整、易用的移位数据库框架,基于 SQLCipher,帮忙 iOS、macOS 和 Android。Wechat高工何俊伟代表:“开源只是传说的上马,我们仍会不断对 WCDB 做修改,包含更易用的接口、更加好的特性、越来越高的可信性。这一个矫正最后也会纹丝不动地在微信使用。”WCDB(WeChatDataBase)是微信官方的移动端数据库组件,致力于提供三个飞跃、易用、完整的运动端存款和储蓄方案。它含有多个模块: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

  • 本篇包含数据库FMDB、CoreData、Realm、文件管理、缓存等.

链式调用

链式调用是指目的的接口重临二个对象,进而允许在单个语句军长调用链接在同盟,而不需求变量来囤积中间结果。

WCDB对于增加和删除改查操作,都提供了相应的类以达成链式调用

WCTInsert
WCTDelete
WCTUpdate
WCTSelect
WCTRowSelect
WCTMultiSelect

where、orderBy、limit等接口的再次回到值均为self,由此能够经过链式调用,更自然越来越灵敏的写出相应的查询。

图片 1

显示屏快照 2018-04-02 晚上8.03.07.png

原创专项论题

数据库的本事选型平昔是个令人切齿腐心的难题,早先非常短一段时间小编都是行使的FMDB,做一些简短的包装。有应用过synchronized同步,也是有用FMDB的DB Queue简单的讲,救经引足。

Code卡塔尔(قطر‎。使用进程供给用大方的代码拼接SQL、拼装Object,并不便于。key-value数据库,代表有Realm、LevelDB、罗克sDB等。Realm因其在各平台封装、优化的优势,相比较受移动开拓者的接待。对于iOS开垦者,key-value的落到实处直接易懂,能够像使用NSDictionary相像接收Realm。而且ORM深透,省去了拼装Object的过程。但其对代码侵入性很强,Realm必要类世袭TiguanLMObject的基类。那对于单世袭的ObjC,意味着没办法再持续其余自定义的子类。同不平日间,key-value数据库对较为复杂的询问现象也相比无力。可以预知,各样方案都有其非常的优势及劣点,未有最佳的,独有最切合的。而对于Wechat来讲,大家所企望的数据库应满意:高效;增删改查的高效是数据库最基本的须求。除却,大家还期待能够援助多少个线程高并发地操作数据库,以应对Wechat频仍收发新闻的光景。易用;那是Wechat开源的法规,也是WCDB的法规。SQLite本不是叁个易用的机件:为了成功贰个询问,往往大家需求写过多拼接字符串、组装Object的胶水代码。这个代码冗长冗杂,并且便于出错,大家期望组件能统一达成这一个职务。完整;数据库操作是叁个参差不齐的气象,大家目的在于数据库组件能完好覆盖种种处境。包含数据库损坏、监察和控制总结、复杂的询问、反注入等。显明,上述顺序方案都无法完全满足Wechat的须求。于是,我们造了那几个“轮子”

WCDB-iOS/Mac。WCDB通过ORM和WINQ,呈现了其易用性上的优势,使得数据库操作不再繁琐。同期,通过链式调用,开拓者也可能有帮忙地得到数据库操作的耗费时间等品质消息。而高档用法规扩充了WCDB的效应和用法。详细情况请见:《Wechat移动端数据库组件WCDB连串(一)-iOS根底篇》WCDB源码下载WCDB源码托管地址:

图片 2

Transaction(事务)

WCDB内可透过二种艺术推行Transaction(事务),一是runTransaction:接口

//事务
- (void)transactionUseBlock {
//    blocked 方式用事务
    BOOL committed = [_database runTransaction:^BOOL{
        SZYMessage *object = [[SZYMessage alloc] init];

        BOOL result = [_database insertObject:object
                                     into:SZY_TABLE_MESSAGE_NAME];
        //return YES to do a commit and return NO to do a rollback
        if (result) {
            return YES;
        }
        return NO;
    } event:^(WCTTransactionEvent event) {
        NSLog(@"Event %d", event);
    }];

}

//不用block方式事务
- (void)transaction {
    BOOL result = [_database beginTransaction];
    SZYMessage *object = [[SZYMessage alloc] init];
    result = [_database insertObject:object
                            into:SZY_TABLE_MESSAGE_NAME];
    if (result) {
        result = [_database commitTransaction];
    } else {
        result = [_database rollbackTransaction];
    }
}

2)应薪金融:大家做了三个集合了直播、观点、问答的一家子桶

  • 笔者简单介绍:何刘兴,资深 Java 工程师
  • 内容简单介绍:金融成品有平安风险且门槛较高,对大许多顾客来讲(祛除嗜好高风险高收益者),感兴趣是或不是行家熟人背书、收益不错、安全轻巧、能不可能得到文化等,这个兴趣点往往由此聊天软件能越来越快完成。恐怕犹如分享经济的本色不在共享而在功用,社交金融的真相应该也不在社交,而在成效。社交金融不是令人更低价闲聊,而应当是更快速建构关联链,快速满意客户对金融成品的兴趣点,进而发出金融交易欲望。

活动建表建库,更新表字段

假让你定义好了您的模型类的天性,当您计划对表数据举办增加和删除改查操作的时候,你无需手动的去创造表和数据库,你应有调用统一的建表接口。
若是表已经济建设好了,当你增添表字段(persistent properties),GYDataCenter也会自行给您更新。小编画了贰个图:

图片 3

注意:⚠️However, GYDataCenter CANNOT delete or rename an existing column. If you plan to do so, you need to create a new table and migrate the data yourself.
GYDataCenter不能够去除和重命名已经存在的列,假如你应当要这么做,须要再行建一张表并migrate数据。

GYDataCenter还能自行的管制目录(indices),缓存(cacheLevel),事务等等。

以询问为例:

NSArray *employees = [Employee objectsWhere:@"WHERE employeeId < 
? ORDER BY employeeId"  arguments:@[ @10 ]];

无需为每二个表去写查询接口,只要在参数中写好标准就能够。开荒者无须拼接字符串,就能够变成SQL的尺度、排序、过滤、更新等等语句。

小摩丝.jpg

安装

1 安装CocoaPods.
2 Podfile里面写 pod 'WCDB'
3 pod install
4 安装好后编写翻译一下

  • 注意: 由于WCDB是结合c++写的,引用#import <WCDB/WCDB.h>的文件.m里面都要改成.mm后缀的,所以日常上为了隔开分离model,不让view喝viewController里面也改成.mm后缀的,我们写叁个model的归类,信守WCTTableCoding协议并写WCDB_PROPERTY(卡塔尔国,WCDB编写翻译后项目里有长足创造model类,直接创立出分类.
  • command + n 弹出窗口,大家拉到上边,开掘成WCDB一栏,选用TableCodeable
![](https://upload-images.jianshu.io/upload_images/2510972-8db851d3b7837fda.png)

屏幕快照 2018-04-02 下午7.33.08.png
  • 改动的三个model类和二个model类的归类
![](https://upload-images.jianshu.io/upload_images/2510972-1dbe17cbdf824813.png)

屏幕快照 2018-04-02 下午7.34.37.png
- SZYMessage.h文件
#import <Foundation/Foundation.h>

@interface SZYMessage : NSObject

@property(nonatomic, copy) NSString *name;
@property(nonatomic, assign) NSInteger localID;
@property(nonatomic, assign) float totalScore;
@property(nonatomic, strong) NSDate *createDate;

@end

- SZYMessage.m文件
#import "SZYMessage+WCTTableCoding.h"
#import "SZYMessage.h"
#import <WCDB/WCDB.h>

@implementation SZYMessage
//WCDB_IMPLEMENTATION,用于在类文件中定义绑定到数据库表的类
WCDB_IMPLEMENTATION(SZYMessage)
//WCDB_SYNTHESIZE,用于在类文件中定义绑定到数据库表的字段
WCDB_SYNTHESIZE(SZYMessage, name)
WCDB_SYNTHESIZE(SZYMessage, localID)


//默认使用属性名作为数据库表的字段名。对于属性名与字段名不同的情况,可以使用WCDB_SYNTHESIZE_COLUMN(className, propertyName, columnName)进行映射。
WCDB_SYNTHESIZE_COLUMN(SZYMessage, totalScore, "db_totalScore")

WCDB_SYNTHESIZE_DEFAULT(SZYMessage, createDate, WCTDefaultTypeCurrentDate) //设置一个默认值

//主键
WCDB_PRIMARY_ASC_AUTO_INCREMENT(SZYMessage, localID)
//用于定义非空约束
WCDB_NOT_NULL(SZYMessage, name)

@end

- SZYMessage+WCTTableCoding.h 文件

#import "SZYMessage.h"
#import <WCDB/WCDB.h>

@interface SZYMessage (WCTTableCoding) <WCTTableCoding>
//WCDB_PROPERTY用于在头文件中声明绑定到数据库表的字段,写在分类里,不写在.h里面,这样view和controller不会 引入导入<WCDB/WCDB.h>的文件

WCDB_PROPERTY(name)
WCDB_PROPERTY(localID)
WCDB_PROPERTY(totalScore)
WCDB_PROPERTY(createDate)

@end

1)Alamofire 的安排性之道

  • 作者简单介绍:黄文臣
  • 内容简单介绍:超越八分之四用斯维夫特编写的iOS App的网络模块都是基于Alamofire的。作为斯维夫特社区最活跃的几个档期的顺序之一,有繁多开垦者在反复的对其举行周详,所以读书这种优质的开源代码对浓郁掌握Swift的特色很有扶助。

GYDatacenter

1.足以用pod或然Carthage集成GYDatacenter。然后使您的模子类世襲GYModelObject:

@interface Employee : GYModelObject
@property (nonatomic, readonly, assign) NSInteger employeeId;
@property (nonatomic, readonly, strong) NSString *name;
@property (nonatomic, readonly, strong) NSDate *dateOfBirth;
@property (nonatomic, readonly, strong) Department *department;
@end

2.重写父类的方法

+ (NSString *)dbName {
    return @"GYDataCenterTests";
}

+ (NSString *)tableName {
    return @"Employee";
}

+ (NSString *)primaryKey {
    return @"employeeId";
}

+ (NSArray *)persistentProperties {
    static NSArray *properties = nil;
    if (!properties) {
        properties = @[
                       @"employeeId",
                       @"name",
                       @"dateOfBirth",
                       @"department"
                       ];
    });
    return properties;
}

3.然后你就能够像上面那样保存和询问model类的数量了:

Employee *employee = ...
[employee save];

employee = [Employee objectForId:@1];
NSArray *employees = [Employee objectsWhere:@"WHERE employeeId < ? 
ORDER BY employeeId" arguments:@[ @10 ]];

model的骨干是兑现GYModelObjectProtocol左券

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, GYCacheLevel) {
    GYCacheLevelNoCache,   //不缓存
    GYCacheLevelDefault,    //内存不足优先清理
    GYCacheLevelResident  //常驻
};

@protocol GYModelObjectProtocol <NSObject>

@property (nonatomic, getter=isCacheHit, readonly) BOOL cacheHit;
@property (nonatomic, getter=isFault, readonly) BOOL fault;
@property (nonatomic, getter=isSaving, readonly) BOOL saving;
@property (nonatomic, getter=isDeleted, readonly) BOOL deleted;

+ (NSString *)dbName;     //db名
+ (NSString *)tableName;  //表名
+ (NSString *)primaryKey; //主键
+ (NSArray *)persistentProperties; //入表的列

+ (NSDictionary *)propertyTypes;   //属性类型
+ (NSDictionary *)propertyClasses; //属性所在的类
+ (NSSet *)relationshipProperties; //关联属性

+ (GYCacheLevel)cacheLevel; //缓存级别

+ (NSString *)fts; //虚表

@optional
+ (NSArray *)indices; //索引
+ (NSDictionary *)defaultValues; //列 默认值

+ (NSString *)tokenize; //虚表令牌

@end

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。