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

108 篇文章 1 订阅

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值