微信 ios android开发教程,iOS开发通过微信学习WCDB(一)

本文详细介绍了iOS开发者常用的数据库框架WCDB,它是一个跨平台的数据库解决方案,支持iOS、macOS和Android。文章通过对比FMDB、Realm和CoreData,分析了WCDB在易用性和性能上的优势。作者分享了WCDB的使用步骤,包括安装、配置、对象映射和基本的数据库操作(如创建、插入、删除、更新和查询)。此外,还提到了数据库加密功能,但指出在实践中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

学习成本高,应用不够广泛

各个框架的使用教程

WCDB使用教程

接下来和大家分享下WCDB的使用,使用步骤如下:

2)安装文件模版,cd path-to-your-wcdb-dir/tools/templates跳转到这个目录下,然后执行sh install.sh安装完成后,重启Xcode,选择新建文件,即可看到对应的文件模版

fe88b1f887017dd1a0133aa4d79c2a6a.png

3)在您的Podfile中,添加pod 'WCDB‘导入到项目中去。

一切准备就绪开始使用了,但是还有一个地方需要特别注意:由于WCDB是一个Objective-C ++框架,对于包含WCDB的项目中的文件,您应该将其扩展名重命名.m为.mm

4)使用文件模版创建Message对象

创建后的文件如下所示:

e11e9a245af50af2aeaf87327e7101c0.png

Message.h文件内容如下:

#import

@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

@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) 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 = [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 = [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];

}

注:加密数据库这段代码自己尝试了,并验证了,发现没效果,不知道是不是自己的使用方法不对造成的,后续会持续关注这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值