一.类字段绑定
在WCDB内,ORM(Object Relational Mapping)是指
- 将一个ObjC的类,映射到数据库的表和索引;
- 将类的property,映射到数据库表的字段;
这一过程。通过ORM,可以达到直接通过Object进行数据库操作,省去拼装过程的目的。
WCDB通过内建的宏实现ORM的功能。如下:
新建一个Model:
.h文件
#import<Foundation/Foundation.h>
#import<WCDB/WCDB.h> // 要导入WCDB
//Message.h
// 继承WCTTableCoding
@interface Message : NSObject
/**信息ID*/
@property (nonatomic, assign) NSInteger messageId;
/**信息标题*/
@property (nonatomic, strong) NSString *title;
/**信息创建时间*/
@property (nonatomic, assign) NSInteger createTime;
/**信息内容*/
@property (nonatomic, strong) NSString *content;
/**信息字数*/
@property (nonatomic, assign) NSInteger count;
// 实现WCTTableCoding代理
WCDB_PROPERTY(messageId)
WCDB_PROPERTY(title)
WCDB_PROPERTY(createTime)
WCDB_PROPERTY(content)
WCDB_PROPERTY(count)
@end
.mm文件(这里需要把.m文件改为.mm文件,因为WCDB是基于Objective-C++)
// Message.mm
#import "Message.h"
@implementation Message
// 使用 WCDB_IMPLEMENTATIO 宏在类文件定义绑定到数据库表的类
WCDB_IMPLEMENTATION(Message)
// 使用 WCDB_SYNTHESIZE 宏在类文件定义需要绑定到数据库表的字段
WCDB_SYNTHESIZE(Message, messageId)
WCDB_SYNTHESIZE(Message, title)
WCDB_SYNTHESIZE(Message, createTime)
WCDB_SYNTHESIZE(Message, content)
WCDB_SYNTHESIZE(Message, count)
// 用于定义主键
WCDB_PRIMARY(Message, messageId)
@end
将一个已有的ObjC类进行ORM绑定的过程如下:
- 定义该类遵循
WCTTableCoding
协议。可以在类声明上定义,也可以通过文件模版在category内定义。 - 使用
WCDB_PROPERTY
宏在头文件声明需要绑定到数据库表的字段。 - 使用
WCDB_IMPLEMENTATIO
宏在类文件定义绑定到数据库表的类。 - 使用
WCDB_SYNTHESIZE
宏在类文件定义需要绑定到数据库表的字段。
简单几行代码,就完成了将类和需要的字段绑定到数据库表的过程。这三个宏在名称和使用习惯上,也都和定义一个ObjC类相似,以此便于记忆。
除此之外,WCDB还提供了许多可选的宏,用于定义数据库索引、约束等,如:
WCDB_PRIMARY
用于定义主键WCDB_INDEX
用于定义索引WCDB_UNIQUE
用于定义唯一约束WCDB_NOT_NULL
用于定义非空约束- ...
更多关于ORM定义,请参考:ORM使用教程
二.增删改查(CRUD)
得益于ORM的定义,WCDB可以直接进行通过object进行增删改查(CRUD)操作。开发者可以通过WCTDatabase
和WCTTable
两个类进行一般的增删改查操作。
1.首先创建一个WCTDatabase
//获得存放数据库文件的沙盒地址
+ (NSString *)wcdbFilePath
{
NSArray *filePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [filePath objectAtIndex:0];
NSString *dbFilePath = [documentPath stringByAppendingPathComponent:@"message.db"];
return dbFilePath;
}
//1.创建数据库的操作
+ (BOOL)creatDatabase
{
database = [[WCTDatabase alloc] initWithPath:[self wcdbFilePath]];
if (![database isTableExists:TABLE_WCDB_NAME]) {
BOOL result = [database createTableAndIndexesOfName:TABLE_WCDB_NAME withClass:Message.class];
return result;
}
return YES;
}
2.增
#pragma mark - 增
+ (BOOL)insertData:(Message *)message
{
if (message == nil) {
return NO;
}
if (database == nil) {
[self creatDatabase];
}
BOOL result = [database insertObject:message into:TABLE_WCDB_NAME];
return result;
}
+ (BOOL)insertDatas:(NSArray<Message *> *)messages
{
if (database == nil) {
[self creatDatabase];
}
BOOL result = [database insertObjects:messages into:TABLE_WCDB_NAME];
return YES;
}
3.删
#pragma mark - 删
+ (BOOL)deleteDataWithId:(NSInteger)messageId
{
if (database == nil) {
[self creatDatabase];
}
BOOL result = [database deleteObjectsFromTable:TABLE_WCDB_NAME where:Message.messageId == messageId];
return result;
}
+ (BOOL)deleteAllData
{
if (database == nil) {
[self creatDatabase];
}
BOOL result = [database deleteAllObjectsFromTable:TABLE_WCDB_NAME];
return result;
}
4.改
#pragma mark - 改
+ (BOOL)updateData:(NSString *)content byId:(NSInteger)messageId
{
if (database == nil) {
[self creatDatabase];
}
Message *message = [[Message alloc] init];
message.content = content;
BOOL result = [database updateRowsInTable:TABLE_WCDB_NAME onProperties:Message.content withObject:message where:Message.messageId == messageId];
return result;
}
+ (BOOL)updateData:(Message *)message
{
if (database == nil) {
[self creatDatabase];
}
BOOL result = [database updateRowsInTable:TABLE_WCDB_NAME onProperties:Message.content withObject:message where:Message.messageId == message.messageId];
[database updateRowsInTable:TABLE_WCDB_NAME onProperties:Message.createTime withObject:message where:Message.messageId == message.messageId];
[database updateRowsInTable:TABLE_WCDB_NAME onProperties:Message.title withObject:message where:Message.messageId == message.messageId];
return result;
}
5.查
#pragma mark - 查
+ (NSArray<Message *> *)getAllData
{
if (database == nil) {
[self creatDatabase];
}
return [database getAllObjectsOfClass:Message.class fromTable:TABLE_WCDB_NAME];
}
+ (NSArray<Message *> *)getData:(NSInteger)messageId
{
if (database == nil) {
[self creatDatabase];
}
return [database getObjectsOfClass:Message.class fromTable:TABLE_WCDB_NAME where:Message.messageId == messageId];
}