一.類欄位綁定
在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];}