iOS开发通过微信学习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

更多优质文章,可以微信扫码关注:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/hhl110120/article/details/79795805