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

来源:互联网 发布:sql语句查询最高两位 编辑:程序博客网 时间:2024/06/06 03:14

一.类字段绑定

在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];}