iOS开发 数据存储之WCDB的使用

一.类字段绑定

在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)操作。开发者可以通过WCTDatabaseWCTTable两个类进行一般的增删改查操作。

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];
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值