移动开发 \ iOS \ iOS开发通过微信学习WCDB(一)

iOS开发通过微信学习WCDB(一)

总点击69
简介:  最近通过对微信ipa包解压发现微信有使用WCDB这个开源库,搜索了一下了解到WCDB(WeChatDatabase)是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS,macOS和Android。经过分析对比,个人感觉WCDB

  最近通过对微信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

更多优质文章,可以微信扫码关注:


意见反馈 常见问题 官方微信 返回顶部