http://www.ox-holdings.com

微信移动端数据库组件WCDB即将开源新匍京娱乐场官方下载:,FMDB数据库的使用演示和封装工具类

摘要微信开发团队宣布将微信自用的移动端数据库组件 WCDB(WeChat Database)正式对外开源。前言微信团队两周前预告即将开源WCDB后(详见当时资讯《[资讯] 微信移动端数据库组件WCDB即将开源!》),于2017年06月09日正式开源了微信自用的移动端数据库组件 WCDB(WeChat Database)。WCDB简介WCDB是一个高效、完整、易用的移动数据库框架,基于 SQLCipher,支持 iOS、macOS 和 Android。微信高级工程师何俊伟表示:“开源只是故事的开始,我们仍会持续对 WCDB 做改进,包括更易用的接口、更好的性能、更高的可靠性。这些改进最终也会原封不动地在微信使用。”WCDB(WeChatDataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案。它包含三个模块:WCDB-iOS/Mac;WCDB-Android;数据库损坏修复工具WCDBRepair。WCDB的开发背景对于iOS开发者来说,数据库的技术选型一直是个令人头痛的问题。由于Apple提供的CoreData框架差强人意,使得开发者们纷纷将目光投向开源社区,寻找更好的存储方案。 对于微信也是如此。数据库是微信内最基础的组件之一,消息收发、联系人、朋友圈等等业务都离不开数据库的支持。为了满足需求,我们也对现有方案做了对比研究。目前移动端数据库方案按其实现可分为两类:关系型数据库,代表有CoreData、FMDB等。CoreData 它是苹果内建框架,和Xcode深度结合,可以很方便进行ORM;但其上手学习成本较高,不容易掌握。稳定性也堪忧,很容易crash;多线程的支持也比较鸡肋。FMDB 它基于SQLite封装,对于有SQLite和ObjC基础的开发者来说,简单易懂,可以直接上手;而缺点也正是在此,FMDB只是将SQLite的C接口封装成了ObjC接口,没有做太多别的优化,即所谓的胶水代码(Glue

数据库的技术选型一直是个令人头痛的问题,之前很长一段时间我都是使用的FMDB,做一些简单的封装。有使用过synchronized同步,也有用FMDB的DB Queue总之,差强人意。

新匍京娱乐场官方下载 1realm

数据库

FMDB- sqlite的工具,
多线程FMDatabaseQueue实例,
FMDB数据库的使用演示和封装工具类,
基于fmdb 的基本操作通过 fmdb 进行的数据库的 基本操作(增删改查 )查找是使用 UISearchBar 和UISearchDisplayController 进行混合使用。
GXDatabaseUtils- 在FMDB基础上的工具。
realm-cocoa- Realm是一个真正为移动设备打造的数据库,同时支持Objective-C和Swfit。Realm宣称其相比Sqlite,在移动设备上有着更好的性能表现,官方中文,iOS:选择 Realm 而不是 CoreData,使用 Realm 和 Swift 创建 ToDo 应用。
RealmIncrementalStore.swift- RealmIncrementalStore.swift:集 Realm 数据库和 CoreData 对象模型两者优势的 Realm 数据库访问类库。
Breeze- 用Swift写的一个轻量级的CoreData管理工具,并且还支持iCloud 。
AlecrimCoreData- Swift,更容易地访问 CoreData 对象封装类库。除了 CRUD,还提供指针定位,强大的排序、筛选,异步数据获取,以及独立线程后台存取数据。
CoreStore- Core Data 管理类库。 其中事务管理及查询是其比较大的亮点,整套 API 功能完整。
MagicalRecord- CoreData第一库,MagicalRecord就像是给Core Data提供了一层外包装,隐藏掉所有不相关的东西。 其中事务管理及查询是其比较大的亮点,整套 API 功能完整。
mogenerator- mogenerator为你定义了的Core Data生成默认的数据类。与xCode不一样的是(xCode一个Entity只生成一个NSManagedObject的子类),mogenerator会为每一个Entity生成两个类。一个为机器准备,一个为人类准备。为机器准备的类一直去匹配data model。为人类准备的类就给你轻松愉快的去修改和保存。
Presentation- 重量级好项目 Presentation,它可以方便你制作定制的动画式教程、Release Notes、个性化演讲稿等。
CoreValue- Swift 2 版 Core Data 封装库。相比另外两个SwiftRecord和CoreStore更轻量。
SQLCipher- SQLCipher使用256-bit AES加密,SQLCipher分为收费版本和免费版本。官方教程,加密你的SQLite- 各种sqlite数据库加密介绍。
SQLCipherDemo下载。
SQLite.swift- 纯swift实现的类型安全的SQLite3封装,数据存储和JSON解析是永恒的话题。
fluent.swift- 纯swift实现的类型安全的SQLite3封装,数据存储和JSON解析是永恒的话题。
swiftydb- 是一个第三方 SQLite 工具,能够大大简化数据库操作。如果你不放心 Realm,那就用 SwiftyDB 吧。使用教程、demo
Graph.swift- 设计新颖、使用简单基于 Core Data 的数据驱动框架库 (作者Daniel Dahan)。

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~

Code)。使用过程需要用大量的代码拼接SQL、拼装Object,并不方便。key-value数据库,代表有Realm、LevelDB、RocksDB等。Realm因其在各平台封装、优化的优势,比较受移动开发者的欢迎。对于iOS开发者,key-value的实现直接易懂,可以像使用NSDictionary一样使用Realm。并且ORM彻底,省去了拼装Object的过程。但其对代码侵入性很强,Realm要求类继承RLMObject的基类。这对于单继承的ObjC,意味着不能再继承其他自定义的子类。同时,key-value数据库对较为复杂的查询场景也比较无力。可见,各个方案都有其独特的优势及劣势,没有最好的,只有最适合的。而对于微信来说,我们所期望的数据库应满足:高效;增删改查的高效是数据库最基本的要求。除此之外,我们还希望能够支持多个线程高并发地操作数据库,以应对微信频繁收发消息的场景。易用;这是微信开源的原则,也是WCDB的原则。SQLite本不是一个易用的组件:为了完成一个查询,往往我们需要写很多拼接字符串、组装Object的胶水代码。这些代码冗长繁杂,而且容易出错,我们希望组件能统一完成这些任务。完整;数据库操作是一个复杂的场景,我们希望数据库组件能完整覆盖各种场景。包括数据库损坏、监控统计、复杂的查询、反注入等。显然,上述各个方案都不能完全满足微信的需求。于是,我们造了这个“轮子”

WCDB-iOS/Mac。WCDB通过ORM和WINQ,体现了其易用性上的优势,使得数据库操作不再繁杂。同时,通过链式调用,开发者也能够方便地获取数据库操作的耗时等性能信息。而高级用法则扩展了WCDB的功能和用法。详情请见:《微信移动端数据库组件WCDB系列(一)-iOS基础篇》WCDB源码下载WCDB源码托管地址:

缺点

FMDB只是将SQLite的C接口封装成了ObjC接口,没有做太多别的优化,即所谓的胶水代码(Glue Code)。使用过程需要用大量的代码拼接SQL、拼装Object,每一个表都要写一堆增删改查,并不方便。

数据库版本升级不友好,特别是第一次安装时会把所有的数据库升级代码都跑一遍。

realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective‑C和Swift)以及Android。2014年7月发布。由YCombinator孵化的创业团队历时几年打造,是第一个专门针对移动平台设计的数据库。目标是取代SQLite。为了彻底解决性能问题,核心数据引擎用C++打造,并不是建立在SQLite之上的ORM。如果对数据引擎实现想深入了解可以查看:Realm 核心数据库引擎探秘。因此得到的收益就是比普通的ORM要快很多,甚至比单独无封装的SQLite还要快。因为是ORM,本身在设计时也针对移动设备(iOS、Android),所以非常简单易用,学习成本很低。

缓存处理

YTKKeyValueStore- Key-Value存储工具类,说明。
TMCache- TMCache 是 Tumblr 开源的一个基于 key/value 的数据缓存类库,可以用于缓存一些临时数据或者需要频繁加载的数据,比如某些下载的数据或者一些临时处理结果。
JLKeychain- 快捷使用keychain存储数据的类,使keychain像NSUserDefaults一样工作。
sskeychain- SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码、账户进行访问,包括读取、删除和设置。
KeychainAccess- 管理Keychain接入的小助手。
YYCache- 高性能的 iOS 缓存框架。
RuntimeDemo- runtime自动归档/解档,源码分析。
Cache.swift- 一款简单、易用的缓存库。支持 MemoryCache, DiskCache 以及前两项组合的 MultiCache。
Cache.swift- Nothing but Cache。
AwesomeCache.swift- Delightful on-disk cache (written in Swift)。
Track.swift- 基于文件系统和链表的 Cache。分为 Disk 和 Memory,线程安全,支持 LRU 淘汰,性能尚可。
PDF
Reader- Reader可提供类似iBooks的文档导航,支持屏幕旋转和所有方向,并通过密码保护加密PDF文件,支持PDF链接和旋转页面。

作者:sanhuazhang,此文发布在微信终端开发团队的专栏

优化

1.自动建表建库:开发者可以便捷地定义数据库表和索引,并且无须写一坨胶水代码拼装对象。

2.开发者无须拼接字符串,即可完成SQL的条件、排序、过滤、更新等等语句。

3.多线程高并发:基本的增删查改等接口都支持多线程访问,开发者无需操心线程安全问题

4.多级缓存,表数据,db信息,队列等等,都会缓存。

以上说的几点我会用微信读书开源的GYDatacenter为例,在下面详细介绍其原理和逻辑。

更加深入的优化:
加密:WCDB提供基于SQLCipher的数据库加密。
损坏修复: WCDB内建了Repair Kit用于修复损坏的数据库。
反注入: WCDB内建了对SQL注入的保护
腾讯前一阵开源的微信数据库WCDB包括了上面的所有优化
我以前分享的SQLite大量数据表的优化

如果你对ObjC的Runtime不是很了解,建议你先阅读我以前写的:RunTime理解与实战之后再阅读下面的内容

数据引自:introducing-realm每秒能在20万条数据中进行查询后count的次数。realm每秒可以进行30.9次查询后count。

图像浏览及处理

FLAnimatedImage- gif播放处理的工具。
CLImageEditor- 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情。
ios-image-filters- 图像滤镜,库比较旧了,很容易崩溃。
XBImageFilters- 图像滤镜。
MWPhotoBrowser- 一个非常不错的照片浏览器,在github的star接近3000个,解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题。
core-image-explorer- Core Image 滤镜处理图片-- swift ,Core Image 介绍。
CoreImageShop- CoreImageShop图片滤镜处理-- Mac app that let you create a complete Core Image Filter usable on iOS using SCRecorder。
GPUImage- 处理图片效果。
GPUImage2.swift- Swift 版基于 GPU 图像和视频处理框架库。
RSKImageCropper- 适用于iOS的图片裁剪器,类似Contacts app,可上下左右移动图片选取最合适的区域。
WZRecyclePhotoStackView- 删除照片交互--WZRecyclePhotoStackView,就是模拟生活中是删除或保留犹豫不决的情形而产生的。 在上滑,下滑的部分,借鉴了
TinderSimpleSwipeCards。
TimingFunctionEditor- TimingFunctionEditor用swift编写, 贝塞尔曲线编辑器,编辑后可以预览或拷贝代码片段直接使用。P.S. 该项目采用更简单的依赖管理器。
Carthage,而非常用的 CocoaPods。
Carthage介绍中文。
AAFaceDetection- AAFaceDetection--swift,简单、实用的面部识别封装库。虽然该技术从 iOS 5 发展,不过真正有趣的应用还不多。
PhotoTweaks- 这个库挺赞的,正好是对图像操作的。
Concorde- swift, Concorde, 一个可用于下载和解码渐进式 JPEG 的库, 可用来改善应用的用户体验。
ZoomTransition- swift, 通过手势操控图片的放大、缩小、旋转等自由变化效果的组件及示例。
AFImageHelper- swift,一套针对 UIImage 和 UIImageView 的实用扩展库,功能包含填色和渐变、裁剪、缩放以及具有缓存机制的在线图片获取。
PinterestSwift- swift,Pinterest 风格图片缩放、切换示例。
KYElegantPhotoGallery- 一个优雅的图片浏览库。
SDPhotoBrowser- 仿新浪动感图片浏览器,非常简单易用的图片浏览器,模仿微博图片浏览器动感效果,综合了图片展示和存储等多项功能。
HZPhotoBrowser- 一个类似于新浪微博图片浏览器的框架(支持显示和隐藏动画;支持双击缩放,手势放大缩小;支持图片存储;支持网络加载gif图片,长图滚动浏览;支持横竖屏显示)。
PhotoStackView-Swift- PhotoStackView——照片叠放视图,使用说明。
MarkingMenu- 基于手势、类似 Autodesk Maya 风格标记菜单及图片渲染。
SXPhotoShow- UICollectionViewFlowLayout流水布局 是当下collectionView中常用且普通的布局方式。本代码也写了三种好看的布局,其中LineLayout和流水布局有很大的相同点就直接继承UICollectionViewFlowLayout,然后StackLayout,CircleLayout这两种都是直接继承自最原始的UICollectionViewLayout 布局方案。
PictureWatermark- 主要实现了给图片加文字以及图片水印的功能,已封装成了UIImage的类别,方便使用。
自定义宽高比的相册框 拍照- 取出照片时 弹出自定义view。在这个自定义view上创建一个需要的相框大小的view层 把取出的图片赋值给UIImageView按缩放添加到这个层上。对uiimageView添加捏合、移动 手势。添加按钮 选取,最后根据位移和缩放比例 裁剪image。
LGPhotoBrowser- LGPhotoBrowser:相册选择/浏览器/照相机(仿微信),包含三个模块:照片浏览器,相册选择器,照相机。
PhotoBrowser- 一个简单的好用的的图片浏览器。
BeautyHour- 完整应用,功能与“美图秀秀”雷同。
MPParallaxView- 是用 Swift 写的类似 Apple TV Parallax 效果的视图。
StitchingImage- 仿微信群组封面拼接控件, 直接拖进项目就可使用,教程。
SDECollectionViewAlbumTransition- 用自定义的 push 和 pop 实现了有趣的 iOS 相册翻开动画效果。
SKPhotoBrowser.swift- swift中规中矩、实用的图片浏览类库。示例也很完整。
Nuke.swift- 完整、强大、实用的图片管理类库。主要功能包括可定制装载,缓存,滤镜及尺寸变换。
DNImagePicker- 类似wechat的图片选择。
CocoaPicker- 仿QQ图片选择器(OC)。
JFImagePickerController- vvebo作者:多选照片、预览已选照片、针对超大图片优化。
VIPhotoView- 图片浏览,用于展示图片的工具类,因为是个 View,所以你可以放在任何地方显示。支持旋转,双击指定位置放大等。
AGImagePickerController- 是一个图片选择器,支持图片多选,支持大图横滑预览,支持放大预览,支持横竖屏,支持所有的iOS设备。
YYImage- 功能强大的 iOS 图像框架,支持大部分动画图像、静态图像的播放/编码/解码。PagingView.swift- 注重细节的自动布局分页视图组件。
TZImagePickerController- 一个支持多选、选原图和视频的图片选择器,同时有预览功能,适配了iOS6789系统。教程.更换头像- 用户选取从相机或者相册获取图片,并且显示在View上。
DouBanMeinv.swift- 抓取豆瓣美女图片,瀑布流显示。
ZZPhotoKit- 基于Photos和AVFoundation框架开源,相册多选与相机连拍。
SwViewCapture.swift- SwViewCapture.swift一个用起来还不错的iOS截图库.(支持截取所有内容, 适用于所有ScrollView组成的视图, 包括WebView)。
BeautifyFaceDemo- 一个基于 GPUImage 的实时直播磨皮滤镜的开源实现,主要功能脸部去斑磨皮!
YUCIHighPassSkinSmoothing- 磨皮滤镜!
Filterpedia.swift- 强大的图片滤镜库演示。
YUGPUImageHighPassSkinSmoothing- 一个基于 GPUImage 的磨皮滤镜!
preview-transition.swift- 通过向导式代码实现步骤,实现完整、自然流畅的图片预览及转场功能。
CartoonEyes.swift- 前置摄像头捕获图像后,采用 Core Image 脸部识别 CIDetector 和漫画效果滤镜复合出卡通效果眼睛。
YLFaceuDemo- 在直播应用中添加Faceu贴纸效果。Faceu贴纸效果其实就是在人脸上贴一些图片,同时这些图片是跟随着人脸的位置改变的。说明

WCDB 作为微信的终端数据库,从 2017.6 开源至今,共迭代了 5 个版本。我们一直关注开发者们的需求,并不断优化性能,新增如全文搜索等常用的功能。而这其中,呼声最高的莫过于 对 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

新匍京娱乐场官方下载 2在20万条中进行一次遍历查询,数据和前面的count相似:realm一秒可以遍历20万条数据31次,而coredata只能进行两次查询。新匍京娱乐场官方下载 3这是在一次事务每秒插入数据的对比,realm每秒可以插入9.4万条记录,在这个比较里纯SQLite的性能最好,每秒可以插入17.8万条记录。然而封装了SQLite的FMDB的成绩大概是realm的一半。新匍京娱乐场官方下载 4

WCDB ObjC 版本的实现中,由于引入了 C++ 代码,并不能直接 bridge 到 Swift。因此,我们从 9 月份开始就着手使用原生的 Swift,重写 WCDB。并于 10.10 和 11.8 分别在开发者群内发布了 alpha 和 beta 版进行测试。

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

只要你定义好了你的模型类的属性,当你准备对表数据进行增删改查操作的时候,你不需要手动的去创建表和数据库,你应该调用统一的建表接口。
如果表已经建好了,当你增加表字段(persistent properties),GYDataCenter也会自动给你更新。我画了一个图:

新匍京娱乐场官方下载 5

自动建库建表.png

注意:⚠️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的条件、排序、过滤、更新等等语句。

实例代码语言是Objective‑C。Realm对象和其他对象没有太大区别,只是需要继承RLMObject

今天,终于可以正式发布 WCDB Swift 的第一个正式版本了。

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