最近通过对微信ipa包解压发现微信有使用WCDB这个开源库,搜索了一下了解到WCDB(WeChat Database)是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。经过分析对比,个人感觉WCDB的优势还是比较突出的。下面我就从几个方面对FMDB,Realm,WCDB,CoreData进行比较分析。由于本人从事iOS开发,对于android方面认识不足,如果有哪些地方认识不到位,还请大家多多批评指正。
各个框架的比较
框架 | 跨平台 | 易操作性 | 缺点 |
---|---|---|---|
WCDB | 支持iOS、macOS、Android等平台 | 是 | swift语言下还不太稳定 |
FMDB | 目前仅支持iOS平台 | 否 | 需要输入完整的sql语句进行操作,不支持以对象的形式进行存储操作 |
Realm | 支持iOS和androd平台 | 是 | 字符长度有限制,并且仅支持基础类型的数据和数组类型和iOS的数组类型不兼容 |
CoreData | 仅支持iOS平台 | 否 | 学习成本高,应用不够广泛 |
各个框架的使用教程
其中关于Realm的相关的文章可以参考《Realm数据库 从入门到“放弃”
》,关于FMDB的使用的文章大家可以参考《FMDB的使用方法(附Demo)》,关于CoreData的使用大家可以参考《CoreData 从入门到精通 (一) 数据模型 + CoreData 栈的创建
》。具体的使用方法,大家可以细细品味啊。
WCDB使用教程
接下来和大家分享下WCDB的使用,使用步骤如下:
1)首先需要去github上下载或者克隆,网址如下:https://github.com/Tencent/wcdb
2)安装文件模版,cd path-to-your-wcdb-dir/tools/templates
跳转到这个目录下,然后执行sh install.sh
安装完成后,重启Xcode,选择新建文件,即可看到对应的文件模版
3)在您的Podfile中,添加pod 'WCDB
‘导入到项目中去。
一切准备就绪开始使用了,但是还有一个地方需要特别注意:由于WCDB是一个Objective-C ++框架,对于包含WCDB的项目中的文件,您应该将其扩展名重命名.m为.mm
4)使用文件模版创建Message对象
创建后的文件如下所示:
Message.h文件内容如下:
#import <Foundation/Foundation.h>
@interface Message : NSObject
@property(nonatomic, assign) NSInteger localID;
@property(nonatomic, copy) NSString *content;
@property(nonatomic, strong) NSDate *createTime;
@property(nonatomic, strong) NSDate *modifiedTime;
@end
Message.mm文件内容如下:
#import "Message+WCTTableCoding.h"
#import "Message.h"
#import <WCDB/WCDB.h>
@implementation Message
WCDB_IMPLEMENTATION(Message)
WCDB_SYNTHESIZE(Message, localID)
WCDB_SYNTHESIZE(Message, content)
WCDB_SYNTHESIZE(Message, createTime)
WCDB_SYNTHESIZE(Message, modifiedTime)
WCDB_PRIMARY(Message, localID)
WCDB_INDEX(Message, "_index", createTime)
@end
Message+WCTTableCoding.h文件内容如下:
@interface Message (WCTTableCoding) <WCTTableCoding>
WCDB_PROPERTY(localID)
WCDB_PROPERTY(content)
WCDB_PROPERTY(createTime)
WCDB_PROPERTY(modifiedTime)
@end
5)开始使用WCDB进行数据库操作
创建sqlite数据库,代码如下:
- (WCTDatabase *)createDataBase{
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *path = [NSString stringWithFormat:@"%@/testDB",docDir];//注意,此处数据库名字不要带sqlite的后缀名,恢复数据库的时候如果有这个后缀名,会造成无法恢复的情况。这是一个坑啊,大家千万要注意
NSLog(@"DB Path %@",path);
WCTDatabase *database = [[WCTDatabase alloc] initWithPath:path];
/*
CREATE TABLE messsage (localID INTEGER PRIMARY KEY,
content TEXT,
createTime BLOB,
modifiedTime BLOB)
*/
BOOL result = [database createTableAndIndexesOfName:@"message"
withClass:Message.class];
if (result) {
return database;
}
return nil;
}
往数据库中插入数据,代码如下:
- (void)inserDataToDB{
self.count++;
//插入
Message *message = [[Message alloc] init];
message.localID = self.count;
message.content = @"Hello, WCDB!";
message.createTime = [NSDate date];
message.modifiedTime = [NSDate date];
/*
INSERT INTO message(localID, content, createTime, modifiedTime)
VALUES(1, "Hello, WCDB!", 1496396165, 1496396165);
*/
BOOL result = [self.database insertObject:message into:@"message"];
}
从数据库中删除数据,代码如下:
- (void)deleteDataToDB{
BOOL result = [self.database deleteObjectsFromTable:@"message"
where:Message.localID > 0];
}
更新数据库中的信息,代码如下:
- (void)updateDataToDB{
Message *message = [[Message alloc] init];
message.content = @"Hi jack!";
BOOL result = [self.database updateAllRowsInTable:@"message"
onProperties:Message.content
withObject:message];
}
查询数据库中的信息,代码如下:
- (void)searchDataFromData{
//查询
//SELECT * FROM message ORDER BY localID
NSArray<Message *> *message = [self.database getObjectsOfClass:Message.class
fromTable:@"message"
orderBy:Message.localID.order()];
//第二种查询方法
// WCTTable *table = [self.database getTableOfName:@"message"
// withClass:Message.class];
// //查询
// //SELECT * FROM message ORDER BY localID
// NSArray<Message *> *message = [table getObjectsOrderBy:Message.localID.order()];
}
- (void)getOneObject{
Message *message = [self.database getOneObjectOfClass:Message.class fromTable:@"message"];//查询的是第一条数据
NSLog(@"message.localID %@",@(message.localID));
}
加密数据库,代码如下:
- (void)encryptDBData{
NSData *password = [@"MyPassword" dataUsingEncoding:NSASCIIStringEncoding];
[self.database setCipherKey:password];
}
注:加密数据库这段代码自己尝试了,并验证了,发现没效果,不知道是不是自己的使用方法不对造成的,后续会持续关注这个问题。
其中demo下载地址如下:https://github.com/xindizhiyin2014/WCDBDemo
更多优质文章,可以微信扫码关注: